約 4,130,811 件
https://w.atwiki.jp/i_ro/pages/171.html
This article or section is in need of attention from an expert on the subject.Please help recruit one or improve this article yourself. See the talk page for details. This page has been marked as being in need of links to other iRO Wiki pages. For a pre-Renewal version of this article, click here. Job Base(s) Rogue Job Type 2-2 Transcendent Changes At Juno× Number of Skills 4 Total Skill Points 16 Total Quest Skills 0 Job Bonuses STR AGI VIT INT DEX LUK +9 +11 +4 +3 +12 +6 + ← クリックで目次を開く Overview Job Change Guide BuildsDagger Bow STR/AGI/DEX Melee STR/DEX/VIT Melee DEX Divest/Bow DEX/INT Divest EquipmentPvM※Full Divestment Class DataSkills Job Bonuses ASPD See Also External Links Overview If you're being pursued by a Stalker, you'd best give up all hope of escape. They specialize in spying, sabotage and stalking, stalking, stalking! They are completely undetectable unless they want their prey to know they were after them—a form of mental torture they relish. The thrill of the chase is personified in the elusive Stalker. And if you get the ridiculous idea of capturing a Stalker, save yourself the trouble and simply accept defeat. They were originally trained to spy upon the Assassins for the Rogue guild but refusing, they now roam alone through the lands. A Stalker is the Transcendent variant of Rogues. Most melee classes try to avoid them like the plague in fear of getting fully divested and then clobbered by one of their many copied skills during WoE. Stalkers are geared more towards PvP× and WoE×, however most builds can do PvM× just as well. Their main forte is the now improved intimidating capability. They can opt to keep any skill gained via Intimidate× by simply casting Preserve×. Most prefer to intimidate Bowling Bash×, it works well with most of their builds. One of their other favored skills is Storm Gust× being cast at its lowest level, which -usually executed after Divest Armor× or Full Divestment×- will render most targets immobile in PvP environment. Their stealth capability also has been improved thanks to the skill Stealth×, complementing Stalk× well. Although being prone to AoE skills, it makes the caster impervious to detection skills like Sight× while also being able to move relatively faster than during stalk. This makes Stalkers one of the two most preferred classes (the other being the Assassin Cross) for guild leader×s, by utilizing Urgent Call× behind enemy lines after successfully avoiding detection. Slap on a Guard of the Deaf that will render them immune to magic, and they are nearly unstoppable in their tracks. Job Change Guide To become a Stalker, you must find a book called 'the Book of Ymir' in 'Sage Castle', Juno×. The book will lead you to Valhalla so you can change your job through the Lord Knight job NPC×. Also you must reach at least job level 40 as a transcendent 1st class character. 1.Sage Castle is located at 11 o'clock direction (yuno 88,320) in Juno. 2.'Book of Ymir' is located inside a room behind an NPC called Metheus Sylphe (yuno_in02 88,164). 3.The Book of Ymir (yuno_in02 94,206) will teleport you to Valhalla. 4.Find and talk to a job NPC suited to your 2nd class. Builds Among the classes in Ragnarok Online, the Stalker is one of the most, if not the most versatile class in the game. They can be basically any type of class in the game, melee, ranged or even caster type. Because of this there are really no specific builds for the class. However, depending on what you want to do with your stalker, there are a few guidelines. Dagger There are a few varying builds for the dagger× stalker. One chooses to distribute their stats mainly in only three categories, strength, vitality, and dexterity. The other will spread their stats out into one more category, agility. While classes with high vitality fare better in WoE for the most part, as a thief class agility is a very important stat. Basically, even if you chose to distribute your stats into 3 main categories, strength, vitality, and dexterity, you would still want a fair amount of agility, with a thief’s flee bonus you can get 200+ flee easily with just a little bit of agility. Agility also is an important factor in attack speed based skills such as Bowling Bash, a skill most stalkers use often. However, this doesn’t necessarily mean that you need to add 100+ agility, a small amount around 50 is fine for most builds. Bow Bow× builds can have more even variations than Strength based builds, they can be melee based, ranged or even caster. In addition, with their high levels of dexterity they can utilize strip skills to their full potential. Only needing to distribute stat points into two main categories, dexterity and vitality, bow builds can have more points left over for other stats such as intelligence, enabling them to use their many sp heavy skills much easier. However, their main deficiency is that they cannot wear bucklers while dealing damage, leading them to add large amounts of vitality to compensate. However, some variations of bow builds will add larger amounts of agility than vitality, favoring the high flee they are able to achieve quite easily. Below are some example builds, to help decided what you may want. STR/AGI/DEX Melee STR× 100-120 AGI× 50-90 VIT× 30-50 INT× 1-20 DEX× 50-70 LUK× 1 Weapons Triple Card×ed Saber , Triple Carded Gladius , Elemental Damascus , Ice Pick× This build does well in PvM, and is not entirely negligible in PvP or WoE especially with the introduction of the Soul Linker class and its Rogue Spirit× for it made the additional +16 STR (at Lv.5) buff of Stealth to last for 300 seconds. The flee gained from the moderate to high AGI helps solo leveling considerably, and also gives an edge at spamming ASPD based skills in PvP environment. Their lower DEX makes Full Divest less effective, albeit far from useless. They can also opt to fill the same roles as a Gank Rogue does. Their preferred intimidated skills are Bowling Bash, Heal× and Raging Trifecta Blow×. STR/DEX/VIT Melee STR 110-140 AGI 1-30 VIT 40-70 INT 10-30 DEX 80-100 LUK 1 Weapons Triple Carded Saber or Blade , Elemental Swords, Ice Pick The VIT based melee is a tad harder to solo level than the AGI build. But since their stat points are spread only into three stats (instead of four), they can opt to get more STR, DEX and VIT respectively. Their moderate VIT makes them more durable and resilient to status effects, and their higher DEX boosts the usefulness of their divest skills. They can also reach 140 STR with Stealth bonus. Leveling is done with Bowling Bash mainly. DEX Divest/Bow STR 1-50 AGI 1-70 VIT 50-90 INT 10-50 DEX 110-130 LUK 1 Weapons Carded or Hybrid Bows This is the solid divest build. They can choose between WoE or PvP by balancing their stats between AGI and VIT. Either way, their DEX will give them a definite edge at divesting in any PvP environment. They can also choose between melee or range by getting either Double Strafe× or Intimidate. Using intimidated skills with a bow also has the added benefit of element on demand thanks to elemental arrows×. This Build mainly prefered as a Guild Leader. Their preferred skill to intimidate is Bowling Bash. They can also go with intimidated Double Strafe if the need arises. DEX/INT Divest STR 1-20 AGI 1 VIT 40-60 INT 70-110 DEX 110-130 LUK 1 Weapons Various Daggers, Bows or Bazerald This build is fairly popular. High DEX for divest and fast cast time, moderate to high INT for large sp-pool and damage with skills. Although the build doesn't leave much room for VIT, they can balance it with INT/DEX for less damage or cast time in favor of resistance/durability. Their preferred skill is Claymore Trap× or Land Mine× for leveling unlike most other builds. The high INT and DEX increases the damage of Claymore Trap and Land Mine, possibly to stronger extent than the usual builds of Hunter and Sniper. It also makes them a viable Wizard if they copy Storm Gust× and coupled with Close Confine× and Full Divestment as a good stopping power during WoE (bar Full Chemical Protection×). Equipment PvM Headgear Musketeer Hat Chick Hat Rideword Hat [1] Fish in Mouth Apple of Archer ※ Armour Thief Clothes [1] + Pecopeco Card or Porcellio Card Garment Wool Scarf [1] + Raydric Card Shoes Tidal Shoes [1] + Matyr Card or Green Ferus Card Shackles Accessory Orleans's Glove [1] + Zerom Card ※ Clip [1] + Marine Sphere Card Bloodied Shackle Ball Weapon Gakkung Bow [2] + Skel Worker Card Orc Archer Bow + Steel Arrow Main Gauche [4] + Drops Card ※ x 4 Ice Pick Shield Buckler [1] Stone Buckler [1] Valkyrja's Shield [1] ※Full Divestment Preferably use these items before casting Full Divestment to increase your success rate. Class Data Skills For more information about Rogue skills, click here. Skill Description Levels Type Counter Instinct× Parry up to 3 attacks, reflecting some of the received damage back to the enemy. 5 Active Full Divestment× Simultaneously remove an enemy's Helm, Armor, Weapon and Shield by chance. 5 Active Preserve× Prevents a stalker from learning a new skill from Intimidate× for 10 min. 1 Active Steal Backpack× Effect unknown. Unimplemented 10 Active Stealth× Hides the stalker and makes the stalker immune to any detecting skills. 5 Active Job Bonuses Stat\Amount +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 STR 1 11 22 32 43 47 53 62 67 AGI 2 9 12 21 27 34 41 45 58 64 70 VIT 6 15 42 63 INT 5 44 57 DEX 10 16 17 26 29 37 38 49 52 56 60 66 LUK 4 20 24 31 50 59 ASPD This article or section is in need of attention from an expert on the subject.Please help recruit one or improve this article yourself. See the talk page for details. See Also Stalker Leveling× External Links Skilltree at Himeyasha's Skill Simulator - Rogue ・ Stalker ・ Shadow Chaser Rogue ・ Stalker ・ Shadow Chaser 2nd ClassSkills Back Stab× ・ Close Confine× ・ Divest Armor× ・ Divest Helm× ・ Divest Shield× ・ Divest Weapon× ・ Double Strafe× ・ Gank× ・ Haggle× ・ Intimidate× ・ Mug× ・ Piece× ・ Remove Trap× ・ Remover× ・ Scribble× ・ Sightless Mind× ・ Slyness× ・ Snatch× ・ Stalk× ・ Sword Mastery× ・ Vulture s Eye× TranscendentSkills Counter Instinct× ・ Full Divestment× ・ Preserve× ・ Steal Backpack× ・ Stealth× 3rd ClassSkills Bloody Lust× ・ Body Painting× ・ Chaos Panic× ・ Deadly Infection× ・ Dimensional Door× ・ Divest Accessory× ・ Fatal Manace× ・ Feint Bomb× ・ Invisibility× ・ Maelstrom× ・ Manhole× ・ Masquerade-Enervation× ・ Masquerade-Groomy× ・ Masquerade-Ignorance× ・ Masquerade-Laziness× ・ Masquerade-Unlucky× ・ Masquerade-Weakness× ・ Reproduce× ・ Shadow Formation× ・ Shadow Spell× ・ Triangle Shot× Quests Rogue Job Change Guide ・ Rogue Skill Quest ・ Rebirth Walkthrough ・ Shadow Chaser Job Change Guide Weapons× Bow× ・ Dagger× ・ One Handed Sword× - Classes of Ragnarok Online Classes of Ragnarok Online Novice Class Novice ・ High Novice ・ Super Novice First Class / High First Class Acolyte ・ Archer ・ Mage ・ Merchant ・ Swordman ・ Thief Second Class Priest ・ Monk ・ Hunter ・ Bard ・ Dancer ・ Wizard ・ Sage ・ Blacksmith ・ Alchemist ・ Knight ・ Crusader ・ Assassin ・ Rogue Transcendent Second Class High Priest ・ Champion ・ Sniper ・ Minstrel ・ Gypsy ・ High Wizard ・ Scholar ・ Mastersmith ・ Biochemist ・ Lord Knight ・ Paladin ・ Assassin Cross ・ Stalker Third Class Arch Bishop ・ Sura ・ Ranger ・ Maestro ・ Wanderer ・ Warlock ・ Sorcerer ・ Mechanic ・ Geneticist ・ Rune Knight ・ Royal Guard ・ Guillotine Cross ・ Shadow Chaser Expanded Class Gunslinger ・ Ninja ・ TaeKwon Kid Expanded Second Class TaeKwon Master ・ Soul Linker ・ Kagerou ・ Oboro ・ Rebel× Doram Summoner Categories Pages needing expert attention | Articles Needing Interwiki Links | Stalker | Classes | Rogue
https://w.atwiki.jp/k2727324602/pages/317.html
魔装機神 THE LORD OF ELEMENTAL(SFC)・武器性能一覧1 ここは魔装機神の武器性能の一覧です。 本作もデータベース用として取っておいたものを編集しました。 今作ではラングラン系魔装機、及びウィーゾルにはランクアップする武器が多いです。青太字で書かれている武器がランクアップ後の武器で、その一つ上の武器をフル改造すると変化します。 例えば、ディスカッターをフル改造すると、その一つ下のバニティリッパーになります。 また、条件次第で追加できる武器(「乱舞の太刀」など)については太字で示してあります。 (条件を満たせるルートが限定される場合、そのルートも記載してあります。) ユニット性能についてはユニットデータの方を参照して下さい。 ちなみに、データ回収に一番苦労したのはソルガディの「ジャハンナム」です。 条件を満たすのを忘れて、第2部でソルガディを味方にした際にジャハンナムが装備されていなかった時の脱力感といったら・・・ ラングラン系魔装機(正魔装機16体、ノルス・レイ、ヴァルシオーネR) ※なお、魔装機については<風系⇒水系⇒炎系⇒大地系>の順で並べてあります。 1.ラングラン系魔装機サイバスター 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 サイフラッシュ 1000 (P)(M) 1-4 +15 - - 30 ±0 第1部でサイフラッシュ調整後追加 敵味方識別可能 射 ⇒サイフラッシュ 1500 (P)(M) 1-6 +20 - - 40 ±0 敵味方識別可能 射 ファミリア 1350 - 1-6 +15 4 - - - 第1部でファミリア誕生イベント後追加 射 ⇒ハイファミリア 2200 - 1-7 +20 5 - - - - 格 ディスカッター 1400 (P) 1 +20 - - - - - 格 ⇒バニティリッパー 2200 (P) 1 +20 - - - - - 射 アカシックバスター 2200 (P) 1 -5 3 30 - +15 - 射 ⇒アカシックバスター 3900 (P) 1-3 +5 5 30 5 +10 - 射 コスモノヴァ 4300 - 2-5 -5 1 - 5 +20 第2部で調整後追加 格 乱舞の太刀 4500 (P) 1 +15 - 50 60 +30 第2部で修行に参加すると追加 ガッデス 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 ケルヴィンブリザード 1100 (M) 2-4 25 - - 20 ±0 - 射 ⇒ケルヴィンブリザード 1500 (P)(M) 2-5 30 - - 35 ±0 敵味方識別可能 格 トライデント 1350 (P) 1 +15 - - - - - 格 ⇒グングニール 1900 (P) 1 +15 - - - - - 射 ファミリア 1350 - 1-6 +15 4 - - - 第1部でファミリア誕生イベント後追加 射 ⇒ハイファミリア 2200 - 1-7 +20 5 - - - - 射 ハイドロプレッシャー 1870 - 1-4 -5 - 30 - - - 射 ⇒ヨツンヘイム 2700 (P) 1-5 +5 - 60 - - - 射 フェンリルクラッシュ 4300 (P) 1-4 +10 - 60 20 +30 第2部で修行に参加すると追加 グランヴェール 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 メギドフレイム 1200 (P)(M) 1-7 +5 - - 25 ±0 直線型MAP兵器 射 ⇒メギドフレイム 2100 (P)(M) 1-8 +10 - - 30 ±0 直線型MAP兵器 敵味方識別可能 射 ファミリア 1350 - 1-6 +15 4 - - - - 射 ⇒ハイファミリア 2200 - 1-7 +20 5 - - - - 格 プラズマソード 1600 (P) 1 +10 - - - - - 格 ⇒フレイムカッター 2700 (P) 1 +10 - 10 - - - 射 カロリックスマッシュ 2950 (P) 1 -5 - 40 - +10 - 射 ⇒電光影裏 3900 (P) 1 +15 - 55 5 +5 - 格 火風青雲剣 3900 (P) 1 +5 - 50 45 +15 第2部で修行後追加 ザムジード 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 レゾナンスクエイク 1000 (M) 1-4 +20 - - 25 ±0 - 射 ⇒レゾナンスクエイク 1400 (M) 1-5 +25 - - 30 ±0 敵味方識別可能 格 プラズマソード 1350 (P) 1 +10 - - - - - 格 ⇒ハイパープラズマソード 2200 (P) 1 +10 - 10 - - - 射 ファミリア 1350 - 1-6 +15 4 - - - - 射 ⇒ハイファミリア 2200 - 1-7 +20 5 - - - - 格 ブーストナックル 1600 (P) 1 +25 - 10 - - - 格 ⇒超振動拳 2500 (P) 1 +30 - 15 - +5 - 射 リニアレールガン 1700 - 3-6 -15 2 - - - - 射 カッシーニの間隙 2800 (P) 3-7 -18 - 50 - +5 第2部で修行に参加すると追加 (ラセツルート、テューディルート) 格 五郎入道正宗 4500 (P) 1 +15 - 50 25 +18 第2部で修行に参加すると追加 (邪神ルート) ジャオーム 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 ビームキャノン 1050 - 1-4 -5 6 - - - - 格 ディスカッター 1200 (P) 1 +15 - - - - - 射 リニアレールガン 1250 - 2-6 -25 3 - - - - 射 ⇒ハイパーレールガン 1900 - 2-7 -15 5 - - - - 格 罪と罰 2900 (P) 1 +15 - 45 20 +15 第2部で条件を満たすと追加 (邪神ルート、テューディルート) 格 ⇒カニエーツ 4000 (P) 1 +15 - 35 45 +10 - ソルガディ 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 メガビームキャノン 1200 - 1-4 -10 2 10 - - - 射 ⇒ツインキャノン 2500 - 1-5 -10 5 - - - - 格 ディスカッター 1200 (P) 1 +15 - - - - - 射 ギガソートカノン 1300 - 1-5 -10 5 - - - - 射 砂嵐 1900 (P) 1 -5 - 30 - - - 格 ジャハンナム 2900 (P) 1 ±0 - 50 20 +15 第1部で条件を満たすと、 第2部で加入時に装備済 格 ⇒アズライール 4000 (P) 1 ±0 - 25 20 +10 - ギオラスト 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 ギガソートカノン 1300 - 1-5 -10 5 - - - - 格 ディスカッター 1300 (P) 1 +15 - - - - - 射 スプラッシュフォール 2800 (P) 1 -5 3 20 - +15 - 射 ⇒バーニングダイブ 3500 (P) 1 +5 3 55 15 +5 - 格 だるま落とし 2800 (P) 1 +5 - 40 20 +15 第2部で加入時に装備済 格 ⇒だるまさんが転んだ 4000 (P) 1 +5 - 30 55 +10 - ファルク 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 ミサイル 900 - 2-5 -5 6 - - - - 射 ソニックブラスト 950 (P) 1-3 ±0 - 15 - - - 格 プラズマソード 1200 (P) 1 +15 - - - - - 射 竜巻 1800 (P) 1 -5 - 40 - +5 - 射 ⇒ハリケーン 2600 (P) 1 ±0 - 30 - +5 - 格 ダモクレスの剣 2900 (P) 1 +5 - 50 20 +10 第2部で加入時に装備済 格 ⇒オッカムのかみそり 4000 (P) 1 +10 - 30 25 +15 - ザイン 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 機雷 1050 - 2-5 -20 3 - - - - 射 バイオフロスト 1200 - 1-4 -10 5 10 - - - 射 ⇒ヴァール・エトワール 2000 (P) 1-5 +5 8 10 - - - 格 プラズマソード 1200 (P) 1 +15 - - - - - 格 ファタ・モルガーナ 2800 (P) 1 +10 - 50 20 +10 第2部でテューディルートのみ 加入時に装備済 格 ⇒アルカンシエル 3900 (P) 1 +10 - 30 25 +15 - ラストール 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 ソニックブラスト 950 (P) 1-3 ±0 - 15 - - - 格 プラズマソード 1200 (P) 1 +15 - - - - - 格 虚空斬 2800 (P) 1 +5 - 40 20 +15 第2部でイベント後追加 格 ⇒真・虚空斬 4100 (P) 1 +10 - 40 55 +25 - 射 戒めの霧 2900 - 1-4 ±0 - 40 10 +10 - 格 裁きの雷 2900 (P) 1 +5 - 40 20 +15 第2部で加入時に装備済 格 ⇒最後の審判 4000 (P) 1 +10 - 40 55 25 - ディンフォース 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 メガビームキャノン 1200 - 1-4 -10 2 10 - - - 射 ⇒ツインキャノン 2500 - 1-5 +5 7 10 - - - 格 プラズマソード 1200 (P) 1 +15 - - - - - 射 グランドナパーム 1500 (P) 1 +10 4 20 - - - 格 ティー・カウ・コーン 3200 (P) 1 +5 - 70 20 +15 第2部で加入時に装備済 格 ⇒ファイ・ワイクル 4200 (P) 1 +10 - 30 55 +20 - ガルガード 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 リニアレールガン 1250 - 2-6 -25 3 - - - - 射 ⇒ハイパーレールガン 1900 - 2-7 -15 5 - - - - 射 ギガソートカノン 1300 - 1-5 -10 5 - - - - 格 ブラッシュブレード 1450 (P) 1 +20 - - - - - 射 黒き霹靂 2900 (P) 1 +5 - 40 10 +1 - 格 雷冥剣 3300 (P) 1 -5 - 60 20 +25 第2部で条件を満たすと追加 (邪神ルート) 格 ⇒冥王活殺剣 4200 (P) 1 +5 - 40 55 +25 - ジェイファー 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 格 プラズマソード 1200 (P) 1 +15 - - - - - 射 リニアレールガン 1250 - 2-6 -25 3 - - - - 射 ⇒ハイパーレールガン 1900 - 2-7 -15 5 - - - - 射 グランドナパーム 1500 (P) 1 +10 4 20 - - - 格 虚空斬 2800 (P) 1 +5 - 40 20 +15 第2部でイベント後追加 格 ⇒真・虚空斬 4100 (P) 1 +10 - 40 55 +25 - ディアブロ 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 ミサイル 900 - 2-5 +15 4 - - - - 格 プラズマソード 1200 (P) 1 +15 - - - - - 射 リニアレールガン 1250 - 2-6 -25 3 - - - - 射 ⇒ハイパーレールガン 1900 - 2-7 -15 5 - - - - 射 緑の墓標 2700 (P) 1 -10 - 30 10 +5 第2部でプレシア家出後、 合流時に追加 格 くるみ割り人形 3700 (P) 1 +15 - 48 25 +20 第2部で条件を満たすと追加 (邪神ルート、テューディルート) 格 ⇒剣の舞 4000 (P) 1 +15 - 30 50 +20 - ラ・ウェンター 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 ミサイル 900 - 2-5 -5 6 - - - - 格 プラズマソード 1200 (P) 1 +15 - - - - - 格 エレクトリックハンマー 1350 (P) 1 +15 - 10 - - - 格 ⇒バッファローホーン 2000 (P) 1 +15 - 10 - - - 射 バスターキャノン 1850 - 3-7 -15 4 - - - - 射 ラヴァージェット 2800 - 2-6 -10 - 60 10 +15 第2部で加入時に装備済 射 ⇒トーテムコール 3800 (P) 2-7 -5 - 40 25 +20 - フェンター 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 ミサイル 900 - 2-5 -5 6 - - - - 格 プラズマソード 1050 (P) 1 +25 - - - - - 射 グランドウェーブ 1200 (P) 1-3 +25 - 10 - - - 射 リニアレールガン 1250 - 2-6 -25 3 - - - - 射 ⇒ハイパーレールガン 1900 - 2-7 -15 5 - - - - 射 白の黙示録 3000 (P) 1 +10 - 40 15 +15 - 射 ⇒光の創世記 3700 (P) 1 +10 - 20 45 +15 - ノルス・レイ 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 格 プラズマソード 1100 (P) 1 +15 - - - - - 射 プラス・ナックル 1150 (P) 1-3 -5 4 - - - - 射 イビルアイ 1350 - 1-4 +10 - 20 - +5 - 射 エンジェルウィスパー 2500 (P) 1 +20 - 50 20 +10 - ヴァルシオーネR 武器名 攻撃 属性 射程 命中 弾数 MG プラーナ 気力 備考 射 サイコブラスター 950 (P)(M) 1-4 +10 2 - 30 ±0 敵味方識別可能 射 ⇒サイコブラスター 1300 (P)(M) 1-6 +15 6 - 40 ±0 敵味方識別可能 格 ディバインアーム 1400 (P) 1 +10 - - - - - 格 ⇒ディバインブレード 2400 (P) 1 +10 - 10 - - - 射 メガビームキャノン 1450 - 2-5 -10 5 - - - - 射 ⇒クロスマッシャー 3900 - 2-6 -5 8 - - - - 射 クロスソーサー 1900 - 1-5 +15 3 - - - - 射 ⇒メビウスジェイド 3400 - 1-7 +20 6 - - - - 格 円月殺法 4400 (P) 1 +10 - 40 45 +20 第2部で修行に参加すると追加 攻略情報(旧)に戻る
https://w.atwiki.jp/dw2_iyaku/pages/111.html
クラウザー飛び越えMod(HD版) クラウザーで道の切れ端を飛び越えることが出来るようになります。(教会脇の道と水車のあるステージまでは確認しました。) Download:(625Kb) 導入方法 ダウンロードしたファイルを解凍してpl0a.udasファイルをResident Evil 4/BIO4/Emフォルダに入れる。 Emフォルダ内のpl0a.udas.lfsをpl0a.uds.lfs$$$など適当にリネームする。
https://w.atwiki.jp/mtgflavortext/pages/5741.html
すべてを食らう渦――生きる者の魂までも。 A vortex that devours everything――even the souls of the living. ゼンディカー 【M TG Wiki】 名前
https://w.atwiki.jp/akasatanahama/pages/21.html
概要 何の機能もない基本的なブロックを追加する。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; @Mod(modid = "AluminiumMod", name = "Aluminium Mod", version = "1.0.0") public class AluminiumMod { public static Item aluminium; //追加するブロックの宣言 public static Block blockAluminium; @EventHandler public void perInit(FMLPreInitializationEvent event) { aluminium = new Item() .setCreativeTab(CreativeTabs.tabMaterials) .setUnlocalizedName("aluminium") .setTextureName("aluminiummod aluminium"); GameRegistry.registerItem(aluminium, "aluminium"); //Blockを継承したクラスのインスタンスを生成し、代入する。 blockAluminium = new AluminiumBlock(Material.rock) //システム名の登録 .setBlockName("blockAluminium") //テクスチャ名の登録 .setBlockTextureName("aluminiummod aluminium_block"); //GameRegistryへの登録 GameRegistry.registerBlock(blockAluminium, "blockAluminium"); } } AluminiumBlock.java package tutorial.aluminiummod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; public class AluminiumBlock extends Block { public AluminiumBlock(Material material) { super(material); //クリエイティブタブの登録 this.setCreativeTab(CreativeTabs.tabBlock); //硬さの設定 this.setHardness(5.0F); //爆破耐性の設定 this.setResistance(10.0F); //ブロックの上を歩いた時の音を登録する。 this.setStepSound(Block.soundTypeMetal); //回収するのに必要なツールを設定する。 this.setHarvestLevel("pickaxe", 2); //明るさの設定 this.setLightLevel(0.0F); } } 解説 Block minecraftのブロックはすべてこのクラスを継承している。 modで追加するブロックもこのクラスを継承することになる。 コンストラクタ(Material material) そのブロックのマテリアルを設定する。 Materialにまとめれているので確認されたし。 Block setBlockName(String name) ブロックのシステム名を登録するメソッド。 Block setBlockTextureName(String name) ブロックのテクスチャを登録するメソッド。 アイテムと同様。 Block setCreativeTab(CreativeTabs tab) ブロックをクリエイティブタブに登録するメソッド。 アイテムと同様。 Block setHardness(float hardness) ブロックの硬さを設定する。 数値を上げると硬くなる。 黒曜石は50.0F。金・ラピスラズリ以外の圧縮ブロックが5.0F。net.minecraft.block.Blockを参照。 Block setResistance(float resistance) ブロックの爆破耐性を設定する。 数値を上げると耐えられる爆発力が高くなる。 黒曜石は2000.0F。圧縮ブロックは10.0F。こちらもnet.minecraft.block.Blockを参照。 Block setStepSound(StepSound sound) ブロックの上を歩いたり、破壊したりしたときになる音の種類を設定する。 void setHarvestLevel(String type, int level) typeで適正ツールの種類を指定、levelでレベルを指定する。 レベルは高いほど要求するツールが強力なものになる。 Block setLightLevel(float level) ブロックの光度を設定する。 ここで渡した値に15をかけたものが光源レベルになる。 0.0~1.0以外は無効。 GameRegistry Block registerBlock(Block block, String name) GameRegistryに追加ブロックを登録するメソッド。 使用例 オファレンブロックを追加する部分。 メタデータなどを使っている箇所は省略した。 +オファレンMOD OfalenModCore.java package nahama.ofalenmod; /*略*/ /**@author Akasata Nahama*/ @Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION) public class OfalenModCore { public static final String MODID = "OfalenMod"; public static final String MODNAME = "Ofalen Mod"; public static final String VERSION = "[1.7.10]1.0.0"; /*略*/ /**最初に行われる処理。アイテム・ブロックの追加などを行う*/ @EventHandler public void preInit(FMLPreInitializationEvent event) { /*略*/ //ブロックを設定するメソッドを実行 OfalenModBlockCore.registerBlock(); /*略*/ } /*略*/ } OfalenModBlockCore.java package nahama.ofalenmod.core; /*略*/ public class OfalenModBlockCore { /*略*/ public static Block blockOfalen; /*略*/ /**ブロックを設定する*/ public static void registerBlock () { /*略*/ blockOfalen = new OfalenBlock() .setBlockName("blockOfalen") .setBlockTextureName("ofalenmod ofalen_block-"); GameRegistry.registerBlock(blockOfalen, ItemOfalenBlock.class, "blockOfalen"); /*略*/ } } OfalenBlock.java package nahama.ofalenmod.block; /*略*/ public class OfalenBlock extends Block { /*略*/ public OfalenBlock() { super(Material.rock); this.setCreativeTab(OfalenModCore.tabOfalen); this.setHardness(7.5F); this.setResistance(15.0F); this.setStepSound(Block.soundTypeMetal); this.setLightLevel(1.0F); this.setHarvestLevel("pickaxe", 3); } /*略*/ } このままテストプレイをしてみると、テクスチャがない状態ではピンクと黒のデフォルトテクスチャになってしまう。 また、名前も、tile.blockAluminium.nameとなる。 これらの解決方法は次回。 コメント この項目に関する質問などをどうぞ。 アルミニウムモッドの時のブロック作成法はないのですか。 - # 2015-07-04 14 49 30 (7月2日までのこのページのソースコードがみたいです。) - # 2015-07-04 14 51 54 ご意見ありがとうございます。現在修正、もしくは併記予定です。 - Tom Kate 2015-07-05 12 22 45 併記する形で修正いたしました。 - Tom Kate 2015-07-05 13 27 24 とても見やすくなってよかったです。ありがとうございます。 - # 2015-07-05 14 46 28 ブロックの面によってテクスチャを変えるにはどうしたらよいのでしょうか - 名無しさん 2015-07-05 20 20 18 ご意見ありがとうございます。使えるメソッドのgetIcon と registerBlockIconsに追記いたしました。 - Tom Kate 2015-07-06 19 56 48 一時的に削除します。「メタデータを持つブロックの追加」で触れるよう修正する予定です。 - 赤砂蛇凪浜 2015-07-10 21 12 56 遅くなりましたが、修正が完了しました。 - 赤砂蛇凪浜 2015-07-23 12 35 35 申し訳ありません blockAluminium = new AluminiumBlock(Material.rock) の部分でなぜかいつもAluminiumBlockのところにエラーが付きますどうすればよいでしょうか?丸コピペしたソースコードを使ってもそうなります - 名無しさん 2015-09-19 15 28 50 クラッシュレポートをクラウドサービスか何かにおいていただいて、urlを送っていただくことはできますか? - Tom Kate 2015-09-19 15 59 11 クラッシュレポートを見せていただければ、こちらで対応いたします。 - Tom Kate 2015-09-19 15 59 49 net.minecraft.block.Blockを参照 と書かれているのですが、どうやって参照するのですか? - 名無しさん 2015-11-01 17 26 38 AluminiumBlock.javaをeclipse上で開き、...extends Block {...のBlockにカーソルを合わせてF3を押せば、Block.classを表示することができます。Blockにはバニラのブロックを追加している部分があるので、そこを見れば、バニラのブロックがどういう設定をされているかを知ることができます。 - 赤砂蛇凪浜 2015-11-04 19 23 57 ブロックを複数追加し、クリエイティブタブも参考にさせていただき作成できました。ですが、ブロック1、ブロック2と数を増やしていくとタブ内での並び順がバラバラになってしまいます。この場合どうすればよいのでしょうか? - 名無しさん 2016-03-05 20 30 20 forge側の不具合で、既存のワールドのクリエイティブタブにアイテム・ブロックを追加すると順序がばらばらになってしまいます。新しくワールドを作り直すと正しい順で表示されると思います。お試しください。 - 赤砂蛇凪浜 2016-03-06 09 15 21 返信ありがとうございます。ワールドを再生成しましたが直りませんでした。。何か設定し忘れているのでしょうか……。ブロックの並び順はブロックIDで決められているのですよね? - 名無しさん 2016-03-07 19 11 47 はい。ブロックIDはMOD側から指定することができないため、基本的にGameRegistryに登録した順ですね。 - 赤砂蛇凪浜 2016-03-07 20 38 17 多分、そこが自分は理解できてないと思うんです。登録順を並べるにはどうすればいいのでしょう?また、registerBlock(X, "Y");このXとYはどういう値にすればうまく並べれるのでしょうか。今は - 名無しさん 2016-03-07 21 40 26 (○○1, "1")、(○○2, "2")という感じになっています - 名無しさん 2016-03-07 21 41 41 おそらく、GameRegistry.registerBlockを呼び出した順だと思われます。 - 赤砂蛇凪浜 2016-03-08 21 37 25 呼び出し順を変える方法を教えて頂きたいです! - 名無しさん 2016-03-09 23 14 39 コード内で記述する順を変えるだけです。 - 赤砂蛇凪浜 2016-03-10 19 21 04 記述する順番はしっかりならべてるんだけどなぁ・・・。どうしても解決できません。。。メタブロックの追加だとうまく表示できたのでそちらに切り替えることにします。初心者に丁寧に教えていただいてありがとうございました!(涙) - 名無しさん 2016-03-13 20 55 45 基本的にできないことはわかっていることを前提として置いて質問します。何か裏技的な形でブロックid - anatawa12 2016-12-16 01 01 27 続き 裏技的な形でブロックidを指定することはできませんか? - anatawa12 2016-12-16 01 03 10 私達も試したことがないためはっきりとしたことは言えません。すみません。以下は軽く調べてみた結果で、間違っている可能性がありますので、ご了承ください。Forgeのシステムに入り込む形で指定することは可能かもしれませんが、簡単ではないと思います。Forgeのブロック追加処理は、GameRegistryからGameData、FMLControlledNamespacedRegistryを経由して行っているようです。ブロックIDは、GameDataやFMLControlledNamespacedRegistryでItem IDとの対応を見ながら決定しているようです。GameData.getMain()がprotectedに指定されているため、代替メソッドを作ろうとしたらそこで詰まりました。 - 赤砂蛇凪浜 2016-12-17 18 26 34 返信ありがとうございます やっぱり難しいですよね 1.7にはたを1.8のidで追加するmodを作ろうと思ったのですが、、 - anatawa12 2016-12-22 15 51 48 質問です。レッドストーンブロックのようにブロックをレッドストーン動力源にするにはどうすればいいのでしょうか? - 名無しさん 2017-01-07 16 00 06 レッドストーンブロックのクラスであるBlockCompressedPoweredを見るとわかると思いますが、以下のようにすればよいです。canProvidePowerをオーバーライドし、常にtrueを返す。isProvidingWeakPowerをオーバーライドし、常に15を返す。 - 赤砂蛇凪浜 2017-01-10 16 06 40 解決しました!! もうひとつ質問なんですけどブロックが光を透過するようにするにはどうすればいいのでしょう。 - 名無しさん 2017-01-11 20 39 31 こっちも解決しました!! .setLightOpacityというメソッドを使いました。 - 名無しさん 2017-01-14 15 12 24 このブロックを階段にするにはどうすればいいですか? - 名無しさん 2017-02-04 16 05 17 返信が遅くなってしまい申し訳ありません。今後チュートリアルを作成する予定です。また、単純な階段ならば、BlockStairsのインスタンスを生成することで実装できます。以下、そのサンプルです。perInitに追記すれば動作します。stairsAluminium = new BlockStairs(blockAluminium, 0).setBlockName("stairsAluminium").setBlockTextureName("aluminiummod aluminium_block");stairsAluminium.setCreativeTab(CreativeTabs.tabBlock);stairsAluminium.setHarvestLevel("pickaxe", 2);stairsAluminium.useNeighborBrightness = true;GameRegistry.registerBlock(stairsAluminium, "stairsAluminium"); - 赤砂蛇凪浜 2017-02-23 17 46 40 名前
https://w.atwiki.jp/k2727324602/pages/316.html
魔装機神 THE LORD OF ELEMENTAL(SFC)・ユニット性能一覧 ここは魔装機神のユニット性能の一覧です。 ここではユニットごとの基本的な性能の他、 味方になるユニットについてはユニットフル改造ボーナスについても詳述してあります。 ちなみに、ユニットフル改造で上昇する可能性があるのはHP、装甲、移動力の項目。 また、霊格が必ず一段階上昇し、特殊能力も追加or強化される可能性があります。 (ユニット性能後部のグレーの部分がフル改造時のステータスです。 カッコ内が上昇幅になっています。) また、敵ユニットについてもフル改造ボーナスの確認できる機体はありますが、 敵のカテゴリ毎に一定の法則性があるように感じたので、各章毎にそれについて記載してあります。 なお、武器性能については武器データの方を参照して下さい。 ラングラン系魔装機(正魔装機16体、ノルス・レイ、ヴァルシオーネR) シュテドニアス系魔装機 バゴニア系魔装機 シュウ&ヴォルクルス系 大ボス系(エウリード、デュラクシール、イスマイル) その他(ザコ系) ※なお、魔装機については<風系⇒水系⇒炎系⇒大地系>の順で並べてあります。 1.ラングラン系魔装機サイバスター HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3600 60 450 6 風高 風 2460 10000 HP回復10% 7100 (+0) 160 1950 (+200) 9 (+3) 風聖 空 - - HP回復10% ガッデス HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3600 60 500 4 水高 水 2250 8800 HP回復10%・修理装置 8100 (+1000) 160 1800 (+0) 4 (+0) 水聖 刻 - - HP回復30%・修理装置 グランヴェール HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3400 55 380 4 炎高 炎 2190 9000 HP回復10% 6900 (+0) 155 1980 (+300) 4 (+0) 炎聖 光 - - HP回復10% ザムジード HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3800 50 800 4 地高 大地 1960 8300 HP回復30% 10300 (+3000) 150 2100 (+0) 5 (+1) 地聖 闇 - - HP回復30% ジャオーム HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2900 40 390 5 風低 陽炎 - 6600 - 9400 (+3000) 140 1990 (+300) 6 (+1) 風高 風 - - HP回復30% ソルガディ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2900 50 360 5 風低 砂嵐 1760 6600 - 7400 (+1000) 150 1760 (+100) 7 (+2) 風高 風 - - - ギオラスト HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2800 40 350 4 風低 竜巻 1780 6700 - 8300 (+2000) 140 1750 (+100) 5 (+1) 風高 風 - - - ファルク HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2800 40 390 4 水低 氷 - 6500 修理装置 9300 (+3000) 140 1990 (+300) 5 (+1) 水高 水 - - HP回復30%・修理装置 ザイン HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2800 40 400 4 水低 雪 - 6500 修理装置 8300 (+2000) 140 1700 (+0) 4 (+0) 水高 水 - - HP回復30%・修理装置 ラストール HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2800 40 380 5 水低 霧 1790 6800 - 7300 (+1000) 140 1780 (+100) 6 (+1) 水高 水 - - HP回復30% ディンフォース HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2800 40 300 4 炎低 電光 - 6500 - 9300 (+3000) 140 1920 (+300) 5 (+1) 炎高 炎 - - HP回復30% ガルガード HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3300 50 350 5 炎低 雷 - 6800 - 8800 (+2000) 150 1950 (+300) 6 (+1) 炎高 炎 - - - ジェイファー HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2800 40 340 4 炎低 熱風 - 6700 - 7300 (+1000) 140 1840 (+200) 5 (+1) 炎高 炎 - - - ディアブロ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2800 40 430 4 地低 森 - 6500 HP回復10% 7300 (+1000) 140 1930 (+200) 4 (+0) 地高 大地 - - HP回復10% ラ・ウェンター HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3200 40 450 4 地低 砂 1450 6500 HP回復?% 8700 (+2000) 140 1950 (+200) 4 (+0) 地高 大地 - - HP回復?% フェンター HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3200 40 450 4 地低 岩 - 6400 HP回復10% 7700 (+1000) 140 1950 (+200) 7 (+3) 地高 大地 - - HP回復10% ノルス・レイ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 2400 40 350 5 水低 いずみ - 4100 修理装置・補給装置 8900 (+3000) 140 1950 (+300) 7 (+2) 水高 水 - - HP回復30%・修理装置・補給装置 ヴァルシオーネR HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3500 40 500 5 なし なし 1730 8800 HP回復10% 9000 (+2000) 140 1800 (+0) 7 (+2) なし なし - - HP回復30% 2.シュテドニアス系魔装機敵魔装機系のフル改造ボーナスは以下の通り。HP+2000 装甲+200 移動+1 霊格一段階上昇 特殊能力は追加なし フル改造を確認できるのはダイオンのみ。 ダイオン HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3900 30 450 4 風低 北風 5400 9900 - ギルドーラ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3500 40 550 4 水低 川 3800 7900 - トゥルーク HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 34000 70 800 5 水高 水 28000 35000 HP回復30% バフォーム HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3300 30 450 4 炎低 マグマ 3500 6000 - ジンオウ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 15700 60 750 5 炎高 炎 20000 30000 HP回復20% ゴリアテ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3500 30 700 4 地低 鉄 3200 6000 - バイラヴァ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 54000 70 4300 5 地高 大地 35000 35000 HP回復30% 3.バゴニア系魔装機敵魔装機系のフル改造ボーナスは以下の通り。HP+2000 装甲+200 移動+1 霊格一段階上昇 特殊能力は追加なし フル改造を確認できるのはアゲイド、アゲイド+、ギンシャス。 アゲイド HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3800 40 350 4 風低 かまいたち 3800 5500 - アゲイド+ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 20000 50 200 5 風高 風 28000 40000 HP回復20% ギンシャス HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3600 40 350 4 水低 湖 3500 5100 - ギンシャス+ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 25300 50 900 5 水高 水 19500 27100 HP回復20% リブナニッカ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3500 30 400 4 炎低 不知火 3200 5900 - リブナニッカ+ HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 18800 60 950 5 炎高 炎 19000 28900 HP回復20% ベンディッド HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3500 40 450 4 地低 山 2700 4200 - ガッツォー HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 48000 40 3900 5 地聖 闇 37000 15300 HP回復30% 4.シュウ&ヴォルクルス系敵デモン系のフル改造ボーナスは基本的になし。 フル改造を確認できるのはデモンゴーレム[強]、死霊装兵、ヴォルクルス。 敵咒霊機系のフル改造ボーナスは以下の通り。HP+2000 装甲+200 移動+1 特殊能力は追加なし フル改造を確認できるのは真ナグツァート。 グランゾン HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 4800 60 1000 5 なし なし 5500 15000 HP回復20% ネオグランゾン HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 25000 100 5000 6 なし なし 30000 45000 HP回復30% 28500 180 6300 6 なし なし - - HP回復30% ※ネオグランゾンは、味方になった時点でプラーナ補正によりMGが255(限界値)に到達してしまっており、 改造不可能状態であるので、全パラメータフル改造が物理的に不可能である。 上述したステータスはHP7段階、MG6段階、装甲7段階改造した時点でのもの。 ウィーゾル改 HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 4300 40 460 5 なし なし 6800 8500 HP回復20% 9800 (+2000) 140 1960 (+200) 7 (+2) なし なし - - HP回復30% デモンゴーレム HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 1400 10 200 3 なし なし 450 100 - デモンゴーレム[強] HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 4300 10 500 3 なし なし 1500 100 - 金のデモンゴーレム HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3200 10 300 3 なし なし 10000 100 - 死霊装兵 HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 3800 30 400 4 なし なし 1900 0 HP回復10% ナグツァート HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 9700 60 550 5 なし なし 10000 18200 HP回復20% ヴォルクルス HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 39000 60 3200 5 なし なし 38000 1000 HP回復20% 真ナグツァート HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 60000 150 6500 5 なし なし 0 0 HP回復30%・無敵モード 5.大ボス系敵魔装機系のフル改造ボーナスは以下の通り。HP+2000 装甲+200 移動+1 特殊能力は追加なし フル改造を確認できるのはエウリード、デュラクシール、イスマイル。 エウリード HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 35000 100 1900 6 なし なし 31000 44000 HP回復30% デュラクシール HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 38000 100 2800 5 なし なし 32000 56200 HP回復30% イスマイル HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 45800 40 3000 5 地聖 闇 36000 14700 HP回復30% 6.その他系敵ザコ系のフル改造ボーナスは以下の通り。HP+2000 装甲+0 移動+1 特殊能力は追加なし フル改造を確認できるのはルジャノール改。 グラフドローン HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 950 10 200 3 なし なし 450 200 - ルジャノール改 HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 1300 10 250 3 - - 750 400 - 機装兵 HP MG 装甲 移動 霊格 守護霊 資金 修理費 特殊能力 1900 20 250 3 なし なし 1500 3400 - 攻略情報(旧)に戻る
https://w.atwiki.jp/chirolonline/pages/25.html
プレイ支援系MOD 導入MOD 説明 配付ページ キー IntelInput 日本語入力支援 T OptiFine グラフィック改善 ShadersCore 影MOD CraftGuide レシピ確認 G InventoryTweaks 持ち物整頓 R CutAll 原木一括破壊 C ZansMinimap ミニマップ表示 M SpawnChecker 沸き範囲確認 Ctrl+↑ DamegeIndicater HP、ダメージ表示 システム改善系MOD 導入MOD 説明 配付ページ FenceGateKeeper 動物がゲートを通れなくなる StackableTools ツールをスタック可能にする StackSizeChange スタック可能数を増加する 要素追加MOD 導入MOD 追加要素 配付ページ MapleTree(もみじ) もみじ関係など TofuCraft(豆腐) 豆腐関係 TwilightForest(黄昏の森) 黄昏ディメンション追加 ThaumCraft 魔術・研究・錬金術 DungeonsPack 地形に構造物追加 Stillhungry 食事・食物追加 便利アイテム追加MOD 導入MOD 追加アイテム 配付ページ MoreInventoryMod コンテナ、ポーチなど CarpentersBlock 建築用ブロック TF2_Teleporter テレポーター EasyCrafting 便利作業台 インテリア系MOD 導入MOD 追加アイテム 配付ページ MyCrayFish_Furniture 家具、電化製品 BiblioCraft 家具、飾り棚系 Bamboo(竹MOD) 和風建築 DecoCraft インテリア全般 機械・回路系 導入MOD 追加アイテム 配付ページ AutoSowSeed 自動種蒔き Redlogic 回路系拡張 Forestry for Minecraft 農業系マシン・養蜂 ※前提MODは省略 ※キーは設定か、コンフィグファイルで変更可能
https://w.atwiki.jp/phoenix-feather/pages/101.html
Mod9 The Plane of Battle クエストのメモ(まだ作成途中) 2つのキャンペーンが追加された。また、野外のセルリアン・ヒルにクエスト2つ「The Captives」「Where There s Smoke...」が追加され、レストレス諸島が荒野化された。 キャンペーンは、Lv4のクエスト6つで構成された「The Sharn Syndicate」(犯罪シンジケート 新規の新興勢力)マーケットプレース内に追加された。Stand Your Ground Dirty Laundr The Stormreaver Fresco The Bookbinder Rescue Repossession Come Out and Slayで、Favorは全てコイン・ロード。 もう一つのキャンペーンは 「The Devils of Shavarath」。新規に作られた街Amrathと、荒野Devil Battlefield内のLv19のクエスト6つとLv20のレイド1つ。The Weapons Shipment Wrath of the Flame A New Invasion Bastion of Power Genesis Point Sins of Attrition Tower of Despair(Raid)FavorはWeponとWrathはトゥエルヴ、他は新規のYugoloth。Raid参加にはYugoloth系のクエスト4つをクリアする必要有り。 情報源はwiki(米国)からのと、実際の経験を元にしています。 Mod9 The Plane of Battle クエストのメモ(まだ作成途中) Mod9クエの概要セルリアン・ヒル「The Captives」The Captives概要 「Where There's Smoke...」Where There's Smoke...概要 シャーン・シンジケートStand Your GroundStand Your Ground概要 Dirty LaundryDirty Laundry概要 The Stormreaver FrescoThe Stormreaver Fresco概要 RepossessionRepossession概要 Come Out and SlayCome Out and Slay概要 *概要 Mod9クエの概要 ストーリーは和訳してくれてるサイト等で。 ユニーク品についてはwiki(米国)で調べよう( ∀`) セルリアン・ヒル mod9で追加された新規クエスト。さっくりやるには丁度いいボリューム。 「The Captives」 Level 3 長さ medium 入口 Grul Tribe Outpost クエ受け Pearl Drumling パトロン The Free Agents The Captives概要 クエ受けNPCは、ハーバーで船長とセルリアンヒルの間を忙しなく往復しているNPCから。 入口は、セルリアンヒル東部、ライオンのいる手前辺り。 オークの巣窟の中、囚われたNPC達を助け(戦いに参加させることも可能)、オーク達を殲滅させる。 「Where There s Smoke...」 Level 3 長さ medium 入口 Nash Braza s Farmstead クエ受け Nash Braza パトロン The Free Agents Where There s Smoke...概要 入口はセルリアンヒルに入って右手(西方)にある。クエ受けNPCもそこにいる。 Nash Brazaの農場にオーク達が( ∀`)捕まっちゃった飼い犬を救出してオークを農場から駆逐するクエスト。 ワンコたちと共に戦う事も出来るし殺しちゃうことも出来る。そこは選択だったかな。ワンコ救出自体はオプション。 シャーン・シンジケート 数が少なく物足りなさが否めなかったマーケットプレース内を舞台にした待望の新クエスト。しかも一応キャンペーン。 ちょっとした仕掛け等で楽しく気軽に遊べそうな反面、F2Pではないのが残念な気が。 連続クエストになっていて、最初はハーバーからマーケットプレースに入ってすぐの左手にいる、Yorrick Amanatsuに話しかけることで始まる。 Stand Your Ground Level 4 長さ short 入口 The Dragontail Saloon クエ受け Maxwell Statler パトロン The Coin Lords Stand Your Ground概要 Dragontail Saloonに進入してくるギャング達を蹴散らす。 MaxwellとRanceを守りつつになる。Maxwellが死ぬとクエ失敗、Ranceを守るのはオプション扱い。 Dirty Laundry Level 4 長さ short 入口 The Shiny Shilling クエ受け Guard Kayd パトロン The Coin Lords Dirty Laundry概要 シャーン・シンジケートのマネーロンダリングをしてる奴らをプチ殺すクエスト…? The Stormreaver Fresco Level 4 長さ short 入口 Lordsmarch Bank(勝手口) クエ受け Burgundy Tir パトロン The Coin Lords The Stormreaver Fresco概要 依頼を受けてロボのZirconとともにBankからストームリーヴァーのフレスコ画を取り出すが、セキュリティが発動、Zirconフレスコ画を持って立ち去り、プレイヤー達は置き去りに…。 Repossession Level 4 長さ short 入口 Goldstone Manor クエ受け Kear パトロン The Coin Lords Repossession概要 Zirconからフレスコ画を取り返す。 Come Out and Slay Level 4 長さ short 入口 The Tenements クエ受け Madhand Mulvaney パトロン The Coin Lords Come Out and Slay概要 シャーン・シンジケートが開いた各ギャング達の会合に潜入し、一掃する。 ネームドの1人を味方にする事が出来る(条件ありみたい) WWのクラン・ナッシュトゥース、ハザディル、クイックフットなどのネームドがいる。 終了後にYorrick Amanatsuに話しかけると、Nickedまたは+2の武器が貰えるぽい。 * Level 4 長さ short 入口 クエ受け パトロン The Coin Lords 概要
https://w.atwiki.jp/arrowsxf10d/pages/21.html
不具合情報 ▼画面がつきっぱなしになる(スリープモードにならない) 16 名前:SIM無しさん[sage] 投稿日:2012/08/06(月) 14 10 24.54 ID 0QSZdj6t [1/2] 画面つきっぱ病を発症して温度上昇で強制終了されてたでござるorz 今回はライブ壁紙が暴走したらしい http //i.imgur.com/HZSHN.png http //i.imgur.com/WMnTV.png 37 名前:SIM無しさん[sage] 投稿日:2012/08/06(月) 16 58 59.45 ID Ja+/1vDC 充電完了時に画面が点きっぱなしになる症状がたびたび発生して困っています。 一定時間以上画面が点灯していたら消すようなアプリって無いでしょうか? 本体設定では15秒にしているのに反映しないようなので・・・ 677 名前:628[sage] 投稿日:2012/08/16(木) 17 33 15.05 ID bwPXGFJo [5/5] どうやら、bluetoothとImgur マッシュが原因だったみたい Imgur マッシュはアクセス許可に、 携帯端末のスリープの無効化 となってて、こいつが何らかの要因でスリープ移行阻止してたみたいだ・・・ ICSが裏でこいつ動き過ぎ!って教えてくれたわw bluetoothは、一度自動ペアリングに失敗してたからそのせいか? ON/OFFでも機能がOFFにならないんで一々強制終了させないとダメみたい ちょいちょい自動ペアリングの失敗するからアプデ待ちだな ▼ネットワーク通信が有効にならないことがある 323 : SIM無しさん : 2012/07/30(月) 20 42 50.86 ID y0YWgJUG [1/1回発言] うちもdocomoのエリア情報だとちょうど境目で たまにLTEが2本くらい立つんだが、LTEも3Gもアイコン消えて、 アンテナがグレーでデータ通信がエラーになるのがしょっちゅうだよ きっとそのときは音声もダメなんだろうけど そもそもアンテナがつかめてないって事だと思うけど、 Wi-FiのON/OFFしても、モバイルデータ通信の設定をON/OFFしてもダメなんだよね 端末を再起動しなくても5~10分くらいすれば3Gのアンテナが立って通信するようにはなるけど、これは結果論かなと。 *#*#4636#*#*をダイヤルして、SimカードのON/OFFしてもネットワークつかまないかな? ▼起動画面から先に進まない・一切の操作を受け付けなくなる 356 名前:SIM無しさん[sage] 投稿日:2012/08/09(木) 07 45 57.34 ID B2WK9CES [1/2] つい今しがたですがネット使用中画面が暗転。 操作をまったく受け付けなくなりました。 電源を一旦落とし再起動しようとしたのですが 電源ボタン押しても「ARROWS」という画面まで行って そこから10分たっても電源が切れません。 仕方なくバッテリーを外し再起動したところ通常動作に戻りました。 今のところは問題なく使えますがとりあえずドコモの店に報告行ってきます。 ▼熱暴走で使用不能になる 310 名前:SIM無しさん[sage] 投稿日:2012/08/04(土) 04 26 42.20 ID GeuOlxJ+ ARROWS X F-10D、「人気」の一方で、熱暴走など不具合報告多数 - 消費者関連ニュース | 投書箱.jp 投書箱.jpを参考 ▼GPSをつかまない 348 名前:SIM無しさん:2012/07/30(月) 21 46 21.55 ID 5L40gFiY やっぱりgpsはバグかな? wifiオンとgpsオンで地図を開く ホームからgpsオフ 再度地図を立ち上げるとgpsをオンしますか?と聞いてくるのでオン するとgpsが補足しない。 ホームに戻りwifiオフ、gpsオフ、オン ホームに戻りたgpsオフ、オン コレで地図に戻ると補足 ▼指紋認証後、すぐに操作しないとフリーズする 658 名前:SIM無しさん[sage] 投稿日:2012/08/10(金) 02 19 58.62 ID gQ5yyXnk 指紋認証にしてるけど、認証後すぐになんかのボタン押さないと1~2秒でスリープになるんだけど だんでだろ? 693 名前:SIM無しさん[sage] 投稿日:2012/08/10(金) 10 06 39.26 ID vbKMkiAB [1/5] 俺のもなるよ 解除したらすぐに画面をスクロールして対処してるよ アプデで改善するように望む ▼再起動無限ループに陥ることがある 27 : SIM無しさん : 2012/08/02(木) 12 25 32.62 ID iG4LdaWc [1/1回発言] 電池切れで落ちてたのをうっかり起動して、シャットダウン中に電源が切れたせいで 再起動ループにはまってたが、電池抜いてしばらく放置したら直った。 不用意に電源入れるのは危ないな。 ▼Wifiのつかみが悪く、通信できないことがある 89 名前:SIM無しさん:2012/07/26(木) 16 11 46.19 ID T5ObbAwb なんかWi-Fiのつかみが悪すぎる。 自宅で並べて置いてるF-05Dではちゃんと勝手に繋がるのに、 F-10DではいちいちOnOffしたり再起動したりしないとなかなか繋がらない。 Wi-Fiの接続改善は、auのARROWS Zでソフトの更新掛かったのでこちらも改善されると思います。 ▼電話着信時にフリーズすることがある ▼まれに一瞬だけ画面表示が乱れることがある ■共通項 【症状】:画面がチラつく 【頻度】:2-3日に1回以上程度(近くできているのは) 【条件】:不明(少なくとも、実行しているアプリは関係無さそう。batterymixのバー表示やscreenfilterアプリを通さないプレーンな 状態で起こるらしい) ■パターン (1). 画面左部に白いギザギザの乱れが出る(ノコギリの歯の溝を強調したような乱れ) (2). 画面上部が黒くなる(一瞬だけチラつく) (3). 画面全体の表示が入り乱れるように乱れる
https://w.atwiki.jp/bannerlord/pages/89.html
クエストの構造 サンプルクエストExampleIssues テスト サンプルクエストの肉付け発生の条件 条件消滅 発生の影響 解決手段 進捗状況 報酬 決着の影響 Quest の中断 会話の作成 サンプルクエスト最終形 クエストの構造 我々が一般に「クエスト」と呼んでいるものは、NPC の抱える問題を表す Issue と、その解決手段から成り立っています。 解決手段は、 プレイヤーによる直接解決である Quest コンパニオンによる代理解決である Alternative Solution 自領で発生した Issue にのみ実行可能な Lord Solution に分類できます。 クラス構造は以下のように、Issue と解決手段を Behavior でくるんでゲームに組み込む、という形になっています。 using TaleWorlds.CampaignSystem; public class Behavior CampaignBehaviorBase { internal class Issue IssueBase { // Issue 自体の定義 // Alternative Solution 関連の定義 // Lord Solution 関連の定義 } internal class IssueQuest QuestBase { // Quest の定義 } } Alternative/Lord Solution は会話や数値のやり取りだけで完結するため、IssueQuest のようなクラスはありません。 以上に加え、データを保存するための SaveableCampaignBehaviorTypeDefiner というクラスも使用します。 サンプルクエスト ExampleIssues プロジェクト名は ExampleIssues としています。 プロジェクトのファイル構成は以下のようになります。 ExampleIssues Main.cs VillageNeedsFood.cs (さらに自分で試作 Issue を増やしていくならファイルを追加) Main.cs using TaleWorlds.CampaignSystem;using TaleWorlds.Core;using TaleWorlds.MountAndBlade; namespace ExampleIssues{ public class SubModule MBSubModuleBase { protected override void OnGameStart(Game game, IGameStarter gameStarterObject) { base.OnGameStart(game, gameStarterObject); if (game.GameType is Campaign) { CampaignGameStarter campaignGameStarter = (CampaignGameStarter)gameStarterObject; campaignGameStarter.AddBehavior(new VillageNeedsFoodBehavior()); // 他にも Issue を作ったなら // campaignGameStarter.AddBehavior(new Issue01Behavior()); // campaignGameStarter.AddBehavior(new Issue02Behavior()); // campaignGameStarter.AddBehavior(new Issue03Behavior()); // のようにまとめて登録します。 } } }} VillageNeedsFood.cs + クリックで展開 using Helpers;using System;using TaleWorlds.CampaignSystem;using TaleWorlds.Core;using TaleWorlds.Localization; namespace ExampleIssues{ public class VillageNeedsFoodBehavior CampaignBehaviorBase { private const float IssueDuration = 30f; private const float QuestTimeLimit = 10f; private const float IssuePreConditionMinPlayerRelation = -10f; public override void RegisterEvents() { CampaignEvents.OnCheckForIssueEvent.AddNonSerializedListener(this, OnCheckForIssue); } public override void SyncData(IDataStore dataStore) { } // イベントリスナーです。 private void OnCheckForIssue(Hero hero) { // 詳しいことは分かりませんが、条件に合う Hero が見つかると // 指定した頻度で Issue が生成されるという感じでしょうか。 if (ConditionsHold(hero)) { Campaign.Current.IssueManager.AddPotentialIssueData( hero, new PotentialIssueData( new PotentialIssueData.StartIssueDelegate(OnStartIssue), typeof(VillageNeedsFoodIssue), IssueBase.IssueFrequency.VeryCommon, null)); } else { Campaign.Current.IssueManager.AddPotentialIssueData( hero, new PotentialIssueData( typeof(VillageNeedsFoodIssue), IssueBase.IssueFrequency.VeryCommon)); } } // Hero が Issue を持つのに必要な条件を設定しています。 private bool ConditionsHold(Hero issueOwner) { return issueOwner.IsNotable; } private IssueBase OnStartIssue(in PotentialIssueData pid, Hero issueOwner) { return new VillageNeedsFoodIssue(issueOwner, DefaultItems.Grain); } // ---------------------------------------------------------------- // Issue に対する Behavior の定義はここまで。 // // ここからは、カスタム型を保存するためのクラスです。 // ---------------------------------------------------------------- // カスタムビヘイビアーで使用する型を登録します。 public class VillageNeedsFoodBehaviorTypeDefiner SaveableCampaignBehaviorTypeDefiner { // saveBaseId は、自分のビヘイビアー同士はもちろん、同時使用している他の MOD とも被ってはいけないそうです。 // また、番号を途中で変えるとセーブデータ読み込み時にクラッシュします。 // 番号付け規則は、追々コミュニティー内で意思統一が図られることでしょう。 public VillageNeedsFoodBehaviorTypeDefiner() base(001_123_456) { } // このクエストで使う独自のクラスを登録しています。 // // 構造体型なら SaveableTypeDefiner.DefineStructTypes() // 列挙型なら SaveableTypeDefiner.DefineEnumTypes() // のようにメソッドが分かれています。 protected override void DefineClassTypes() { // こちらの saveId は、各 SaveableCampaignBehaviorTypeDefiner の中で被りが無ければいいようです。 AddClassDefinition(typeof(VillageNeedsFoodIssue), 1); AddClassDefinition(typeof(VillageNeedsFoodIssueQuest), 2); } } // ---------------------------------------------------------------- // カスタム型の宣言はここまで。 // // ここからは Issue 本体の定義です。 // ---------------------------------------------------------------- internal class VillageNeedsFoodIssue IssueBase { [SaveableField(10)] private readonly ItemObject _requestedFood; // IssueBase.IssueBase() に渡す日数は、Issue が自然消滅するまでの日数です。 // クエストの達成期限と混同しないようにしてください。 public VillageNeedsFoodIssue(Hero issueOwner, ItemObject requestedFood) base(issueOwner, CampaignTime.DaysFromNow(IssueDuration)) { _requestedFood = requestedFood; } // Issue のタイトルです。 // 町などで Issue を抱えている人物のポートレートに表示されます。 // Quest のタイトルとは同じにも別にもできます。 // // チートコードで IssueOwner を探せなくなるので、テストでは日本語名は避けた方がいいです。 public override TextObject Title = new TextObject("Village Needs Food"); // Issue 内容の簡単な説明です。 // IssueOwner のポートレートで Title にマウスカーソルを合わせるとホバー表示されます。 public override TextObject Description { get { TextObject textObject = new TextObject("{ISSUE_OWNER.LINK} が食糧を届けるよう頼んでいる。"); StringHelpers.SetCharacterProperties("ISSUE_OWNER", IssueOwner.CharacterObject, textObject); return textObject; } } // 導入部のセリフのオーバーライドです。 public override TextObject IssueBriefByIssueGiver { get { TextObject textObject = new TextObject( "{FOOD} が乏しくなっているのですが、 " + "近くの町でもあまり手に入らないのです。 " + "このご時世、あまり遠方へ買い求めに行くことも " + "できず、困っております。"); textObject.SetTextVariable("FOOD", _requestedFood.Name); return textObject; } } public override TextObject IssueAcceptByPlayer = new TextObject( "何か私にできることはあるか?"); public override TextObject IssueQuestSolutionExplanationByIssueGiver = new TextObject( "いずこかで買い求め、持ってきてはいただけませ " + "んでしょうか? 報酬はお支払いいたします。"); public override TextObject IssueQuestSolutionAcceptByPlayer = new TextObject( "わかった、やってみよう。"); // コンパニオンに解決を任せられるか否かです。 public override bool IsThereAlternativeSolution = false; // 領主として影響力を消費して解決できるか否かです。 public override bool IsThereLordSolution = false; // 要求される食糧の量です。 // クエスト難易度でスケーリングしています。 private int RequestedFoodAmount = (int)(15f + (30f * IssueDifficultyMultiplier)); // Issue が自動生成される頻度です。 // IssueFrequency.VeryCommon // IssueFrequency.Common // IssueFrequency.Rare public override IssueFrequency GetFrequency() { return IssueFrequency.VeryCommon; } // Issue が消滅する条件を設定できます (StayAlive なので、正確には「消滅しないための条件」です)。 // // 例えば、この Issue が「物資を依頼人とは別の人のもとに届ける」というような内容だった場合、 // 届け先の人物が何らかの理由でゲームから退場してしまったら、その時点で Issue は破棄されなければなりません。 // (もちろん、プレイヤーが既にクエストを請けていればクエストも中止されるべきですが、それは Quest 側の仕事です。) // それには、以下のような感じにします。フィールドはあくまで一例です。 // bool IssueStayAliveConditions() = _targetNotable.IsActive; public override bool IssueStayAliveConditions() { return true; } // プレイヤーが Issue 解決を請け負えるかどうかの条件を設定できます。 protected override bool CanPlayerTakeQuestConditions( Hero issueGiver, out PreconditionFlags flag, out Hero relationHero, out SkillObject skill) { // 各条件に対応する PreconditionFlags でビットマスクをかけていきます。 flag = PreconditionFlags.None; relationHero = null; skill = null; // 友好度が低いと受けられないようにする。 if (issueGiver.GetRelationWithPlayer() IssuePreConditionMinPlayerRelation) { // このフラグを立てたときには、誰と仲が悪くて受けられないのかを返す必要があるようです。 flag |= PreconditionFlags.Relation; relationHero = issueGiver; } // 所属国同士が戦争中だと受けられないようにする。 if (issueGiver.MapFaction.IsAtWarWith(Hero.MainHero.MapFaction)) { flag |= PreconditionFlags.AtWar; } // いずれかのフラグが立っていると false が返るので請け負えなくなります。 return flag == PreconditionFlags.None; } // 詳細不明。公式の Issue でもほぼ使われていません。 protected override void CompleteIssueWithTimedOutConsequences() { } // Quest の発行処理です。 // コンストラクターに渡す日数は Quest の達成期限です。 protected override QuestBase GenerateIssueQuest(string questId) { return new VillageNeedsFoodIssueQuest( questId, IssueOwner, RequestedFoodAmount, _requestedFood, RewardGold, CampaignTime.DaysFromNow(QuestTimeLimit)); } protected override void OnGameLoad() { } } // ---------------------------------------------------------------- // Issue の定義はここまで。 // // ここからは Quest の定義です。 // ---------------------------------------------------------------- internal class VillageNeedsFoodIssueQuest QuestBase { // これらのフィールドは、セーブ/ロードをまたいで保持されるべき数値なので、SaveableField 属性を与えています。 // SaveableCampaignBehaviorTypeDefiner の宣言だけではダメなようです。 [SaveableField(10)] private readonly ItemObject _foodToBeDelivered; [SaveableField(20)] private readonly int _numFoodToBeDelivered; // Quest のタイトルです。 // ジャーナル (クエストログ) に表示されます。 // Issue のタイトルとは同じにも別にもできます。 public override TextObject Title = new TextObject("村が食糧を求めている"); // ジャーナルで達成期限を非表示にするか否かです。 public override bool IsRemainingTimeHidden = false; private TextObject QuestAcceptLog { get { TextObject textObject = new TextObject("{SETTLEMENT.LINK} の {QUEST_GIVER.LINK} に、{REQUESTED_FOOD} を持ってくるよう頼まれた。 報酬として {PAYMENT}{GOLD_ICON} を払ってくれるそうだ。"); StringHelpers.SetSettlementProperties("SETTLEMENT", QuestGiver.CurrentSettlement, textObject); StringHelpers.SetCharacterProperties("QUEST_GIVER", QuestGiver.CharacterObject, textObject); textObject.SetTextVariable("REQUESTED_FOOD", _foodToBeDelivered.Name) .SetTextVariable("PAYMENT", RewardGold); return textObject; } } private TextObject QuestSuccessLog { get { TextObject textObject = new TextObject("{QUEST_GIVER.LINK} のもとに、約束していた食糧を届けた。"); StringHelpers.SetCharacterProperties("QUEST_GIVER", QuestGiver.CharacterObject, textObject); return textObject; } } public VillageNeedsFoodIssueQuest( string questId, Hero questGiver, int numFoodToBeDelivered, ItemObject foodToBeDelivered, int rewardGold, CampaignTime duration) base(questId, questGiver, duration, rewardGold) { _numFoodToBeDelivered = numFoodToBeDelivered; _foodToBeDelivered = foodToBeDelivered; SetDialogs(); InitializeQuestOnCreation(); } // クエスト進行中にゲームをセーブ - ロードした場合の初期化はここで行われます。 protected override void InitializeQuestOnGameLoad() { SetDialogs(); } // 会話の流れと、それに伴う処理のデリゲートを設定します。 protected override void SetDialogs() { OfferDialogFlow = DialogFlow.CreateDialogFlow(IssueManager.IssueClassicQuestStartToken) .NpcLine("お手数ですが、よろしくお願いいたします。") .Condition(() = Hero.OneToOneConversationHero == QuestGiver) .Consequence(new ConversationSentence.OnConsequenceDelegate(QuestAcceptedConsequences)) .CloseDialog(); DiscussDialogFlow = DialogFlow.CreateDialogFlow(QuestManager.QuestDiscussToken) .NpcLine("お頼みした仕事の首尾はいかがですかな?") .Condition(() = Hero.OneToOneConversationHero == QuestGiver) .BeginPlayerOptions() .PlayerOption("うむ、ここに持ってまいった。") .Condition(new ConversationSentence.OnConditionDelegate(PlayerHasFood)) .NpcLine("おお、ありがとうございます。 それでは、こちらをお納めくだされ。") .Consequence(new ConversationSentence.OnConsequenceDelegate(QuestFinishedConsequences)) .PlayerOption("いま取り組んでいるところだ。 しばし待たれよ。") .NpcLine("さようですか。 何卒よろしくお願いいたします。") .EndPlayerOptions() .CloseDialog(); // QuestCharacterDialogFlow = DialogFlow.CreateDialogFlow(QuestManager.CharacterTalkToken); } // 以下、会話の特定の段階で実行される処理です。 // クエストを請けたとき private void QuestAcceptedConsequences() { AddLog(QuestAcceptLog); // これを呼ぶだけで、通知の表示や効果音再生など、クエスト開始に伴う処理が自動的に実行されます。 StartQuest(); } // クエスト目標をクリアしたとき private void QuestFinishedConsequences() { TransferFoodFromPlayerInventory(); AddLog(QuestSuccessLog); // クエストがどういう結果に終わったのかを QuestBase に知らせる必要があります。 // CompleteQuestWithSuccess() なら成功 // CompleteQuestWithFail() なら失敗 // CompleteQuestWithCancel() なら中止 // CompleteQuestWithTimedOut() なら期限切れ // CompleteQuestWithBetrayal() なら依頼人を裏切る形での決着 CompleteQuestWithSuccess(); } private bool PlayerHasFood() { return PartyBase.MainParty.ItemRoster.GetItemNumber(_foodToBeDelivered) = _numFoodToBeDelivered; } private void TransferFoodFromPlayerInventory() { GiveItemAction.ApplyForParties( PartyBase.MainParty, QuestGiver.CurrentSettlement.Party, _foodToBeDelivered, _numFoodToBeDelivered); } } }} テスト フォルダー構成や SubModule.xml についてなどはこれまで同様です。 セリフ等に日本語テキストを使っていますが、日本語化 MOD を入れていなくても普通に表示されるはずです。 テストプレイの際はチートを使うとはかどります。使い方の詳細については「チート」ページを参照してください。 IssueOwner のもとに行くには、 campaign.print_specific_issues village needs food で所在地が一覧表示されるので、 campaign.find_settlement 拠点名 でカメラ移動し、Ctrl + 左クリックで拠点のそばにワープしましょう。 サンプルクエストの肉付け サンプルは、Issue の生成から Quest 完了までの骨組みだけが実装してあります。このままでも一応動作はしますが、中身はスカスカで何も実行されていない状態なので、これにいろいろ追加していきましょう。 コードはあくまで一例なので、大体のやり方をつかんだら好きにいじくってもらって構いません。 発生の条件 サンプルクエストは Grain を IssueOwner のもとに持っていくというものですが、IssueOwner のいる拠点に Grain が豊富にある場合、その拠点で買ってすぐにクリアなんてことができてしまいますし、何より「食糧が無くて困っている」という Issue のストーリー自体が破綻してしまっています。したがって、Grain が豊富な拠点の Hero はそもそも IssueOwner に選ばれないようにする措置が必要です。 + サンプルコード VillageNeedsFoodIssueBehavior private const int VillageGoodsThreshold = 10; private const int TownGoodsThreshold = 50; private bool ConditionsHold(Hero issueOwner) { // IssueOwner になれるのは Headman (村長) のみ // IssueOwner は村に所属していなければならない // その村の食糧は一定値未満でなければならない Settlement currentSettlement = issueOwner.CurrentSettlement; if (!issueOwner.IsHeadman || currentSettlement is null || !currentSettlement.IsVillage || currentSettlement.ItemRoster.GetItemNumber(DefaultItems.Grain) = VillageFoodThreshold) { return false; } // 町と取引していないか、町にも食糧が無い Settlement tradeBound = currentSettlement.Village.TradeBound; return tradeBound is null || tradeBound.ItemRoster.GetItemNumber(DefaultItems.Grain) TownFoodThreshold; } 条件消滅 Issue 生成時には存在していた問題が、プレイヤー以外の力によって解決してしまうこともあり得ます。サンプルで言えば、最初は Grain が不足していたとしても、村人が買い入れるなどして補充された、というような状況です。そんな時には Issue を消滅させる方が自然でしょう。 消滅条件は IssueBase.IssueStayAliveConditions() で設定します。 + サンプルコード VillageNeedsFoodIssue public override bool IssueStayAliveConditions() { // 食糧がクエスト開始条件の3倍以上に増えたら false を返して消滅させます。 return IssueOwner.CurrentSettlement.ItemRoster.GetItemNumber(_requestedFood) VillageFoodThreshold * 3; } 発生の影響 公式のクエストは、「Issue が存在している限り何らかのパラメーターが変化し続ける」という形で Issue の影響を表現しています。例えば、賊討伐クエストだったら賊がのさばっていることを表すために拠点の治安が減り続け、道具不足の村は寂れて世帯数が減り続ける、といった具合です。 これを実装するには IssueBase.GetIssueEffectsAndAmountInternal() をオーバーライドします。 + サンプルコード VillageNeedsFoodIssue // using System.Collections.Generic protected override Dictionary IssueEffect, float GetIssueEffectsAndAmountInternal() { // 変化量は1日あたりのものです。Issue の自然消滅日数を考慮して設定しないと、 // トータルのペナルティが重くなりすぎてしまいます。 return new Dictionary IssueEffect, float () { { DefaultIssueEffects.VillageHearth, -0.5f }, { DefaultIssueEffects.IssueOwnerPower, -0.2f } }; } 解決手段 Issue の解決手段には、プレイヤーによる Quest クリア、Alternative Solution、Lord Solution の三通りがあります。サンプルには解決手段が Quest しか用意されていないので、Alternative Solution も追加してみましょう。 最初にも書いたように、Alternative/Lord Solution は Quest と違って会話と数値のやり取りしか発生しないので、全ての要素を Issue クラスの中で定義します。IssueBase に用意されたプロパティやメソッドをオーバーライドすることで、大体は動くようになっています。 public abstract bool IsThereAlternativeSolution まずは、これを true にします。 protected virtual int AlternativeSolutionNeededBaseMenCountInternal コンパニオンのお供として連れて行かせる兵数です。 public virtual bool DoTroopsSatisfyAlternativeSolution(TroopRoster troopRoster, out TextObject explanation) Alternative Solution を開始するのに十分な兵がいるかをチェックする場所です。 public virtual bool CompanionOrFamilyMemberClickableCondition(Hero hero, out TextObject explanation) 派遣できる英雄の条件を設定する場所です。 public virtual bool IsTroopTypeNeededByAlternativeSolution(CharacterObject character) お供として選べる兵の条件 (主にティア) を設定する場所です。 protected virtual int AlternativeSolutionBaseDurationInDaysInternal 解決までにかかる日数です。 protected virtual int CompanionSkillRewardXP コンパニオンに入るスキル経験値です。 protected virtual TextObject AlternativeSolutionStartLog protected virtual TextObject AlternativeSolutionEndLogDefault 開始・終了時にジャーナルに書き込まれるログテキストです。 public virtual TextObject IssueAlternativeSolutionExplanationByIssueGiver Quest の説明を受けた後のプレイヤーのセリフ、“Any other way?”(他に手段は?) に続いて表示される IssueOwner のセリフです。 public virtual TextObject IssueAlternativeSolutionAcceptByPlayer いずれかの解決手段を選ぶ場面で、Alternative Solution の選択肢に表示されるテキストです。 public virtual TextObject IssueAlternativeSolutionResponseByIssueGiver Alternative Solution を選択した際の IssueOwner のセリフです。 進捗状況 クエストの進捗状況 (サンプルクエストの場合「物資を幾つ集めたか」) を、プログレスバーとしてジャーナルに表示できます。 protected JournalLog AddDiscreteLog(TextObject text, TextObject taskName, int currentProgress, int targetProgress, TextObject shortText = null, bool hideInformation = false) text ログテキスト taskName プログレスバーが何を表しているのかを説明するテキスト currentProgress プログレスバーの初期値 targetProgress プログレスバーの最大値 ただし、このプログレスバーは自動的に更新されるわけではありません。サンプルクエストで言えば、インベントリーをチェックして物資量に変化があるたびに書き換える必要があります。 + サンプルコード VillageNeedsFoodIssueQuest // using TaleWorlds.CampaignSystem.SandBox private JournalLog _progressLog; private TextObject FoodGatheredInfo { get { TextObject textObject = new TextObject("必要な {FOOD} が集まりました。 依頼人の所に戻りましょう。"); textObject.SetTextVariable("FOOD", _foodToBeDelivered.Name); return textObject; } } private int CurrentFoodAmount = PartyBase.MainParty.ItemRoster.GetItemNumber(_foodToBeDelivered); protected override void RegisterEvents() { CampaignEvents.PlayerInventoryExchangeEvent.AddNonSerializedListener(this, OnPlayerInventoryExchange); } // クエストを請けたとき private void QuestAcceptedConsequences() { AddLog(QuestAcceptLog); // プログレスバーを追加しています。 TextObject text = new TextObject("{FOOD}を{FOOD_NUMBER}集める。") .SetTextVariable("FOOD", _foodToBeDelivered.Name) .SetTextVariable("FOOD_NUMBER", _numFoodToBeDelivered); // text の部分を TextObject.Empty とすれば、純粋にプログレスバーだけの表示になります。 _progressLog = AddDiscreteLog(text, new TextObject("集めた食糧"), 0, _numFoodToBeDelivered); UpdateProgress(); // これを呼ぶだけで、通知の表示や効果音再生など、クエスト開始に伴う処理が自動的に実行されます。 StartQuest(); } private void UpdateProgress() { _progressLog.UpdateCurrentProgress((int)MathF.Clamp(CurrentFoodAmount, 0f, _numFoodToBeDelivered)); } private void OnPlayerInventoryExchange( List ValueTuple ItemRosterElement, int purchasedItems, List ValueTuple ItemRosterElement, int soldItems, bool isTrading) { UpdateProgress(); if (PlayerHasFood()) { // クリア条件を満たしたことを通知でプレイヤーに知らせています。 InformationManager.AddQuickInformation(FoodGatheredInfo); } } 報酬 報酬をお金で渡すには、まず IssueBase.RewardGold プロパティをオーバーライドして報酬額を設定します。固定値にしてもいいですが、公式のクエストではクエスト難易度でスケーリングしていることが多いです。 protected override int RewardGold = (int)(500f + 1000f * IssueDifficultyMultiplier); こうすると、基本値 500 と、難易度係数 (0.1 ~ 1.0) で変動する値が 1000 なので、600 ~ 1500 が報酬額となるわけです。 IssueBase.RewardGold は QuestBase のコンストラクターに渡されるので、QuestBase.RewardGold フィールドにも自動的に値が設定されます。 値を設定したら、次はそれを授与する処理です。「報酬」とは成功したことを報いるものですから、仮想メソッド QuestBase.OnCompleteWithSuccess() をオーバーライドして、そこに記述するのがいいでしょう。 + サンプルコード VillageNeedsFoodIssueQuest protected override void OnCompleteWithSuccess() { // プレイヤーキャラクターに対する報酬 // IssueBase.RewardGold が設定してあれば、QuestBase.RewardGold ↓ にも反映されています。 GiveGoldAction.ApplyBetweenCharacters(null, Hero.MainHero, RewardGold); Hero.MainHero.AddSkillXp(DefaultSkills.Athletics, 100f); } 報酬を物品で渡したいなら、ここをアイテム授与の記述にします。 VillageNeedsFoodIssueQuest protected override void OnCompleteWithSuccess() { GiveItemAction.ApplyForParties(null, PartyBase.MainParty, DefaultItems.Meat, 10); } これで、プレイヤーが Issue を解決する行為、すなわち Quest への報酬が設定されました。Quest 以外の解決手段である、Alternative/Lord Solution に対する金銭報酬は、IssueBase.RewardGold を設定しておくだけで支払いまで勝手にやってくれます。物品の場合は、IssueBase.AlternativeSolutionEndWithSuccessConsequence() や IssueBase.LordSolutionConsequence() あたりをオーバーライドして記述することになるでしょう。 決着の影響 Issue が、成功にせよ失敗にせよ、一応の決着を見たことによって生じる影響はいろいろ考えられますが、代表的なのは、プレイヤーと IssueOwner との Relation (関係性、友好度) 変化でしょうか。IssueBase.RelationshipChangeWithIssueOwner と、QuestBase.RelationshipChangeWithQuestGiver という専用のプロパティが用意されており、そこに変化量を指定するだけで、一部パークの影響なども含めて勝手に処理してくれます。前者は Alternative/Lord Solution 用、後者は Quest 用です。 他にも影響するであろう物事は、 Power 英雄の権力や地位を数値化したもの。問題を解決したことで、IssueOwner の所属コミュニティー内での地位が向上する、というイメージです。 Trait 英雄の特性、性質、性格といったもの。期限を守らなかったり IssueOwner を裏切ったりしたら、プレイヤーの Honor を下げる、みたいなことです。 Skill 例えば武力行使を伴うようなクエストだったら、武器スキル経験値が入ったりするのもいいかもしれません。 + サンプルコード VillageNeedsFoodIssueQuest protected override void OnCompleteWithSuccess() { // プレイヤーキャラクターに対する報酬 // IssueBase.RewardGold が設定してあれば、QuestBase.RewardGold ↓ にも反映されています。 GiveGoldAction.ApplyBetweenCharacters(null, Hero.MainHero, RewardGold); Hero.MainHero.AddSkillXp(DefaultSkills.Athletics, 100f); // クリアしたことによる影響 // Relation 値の幅は -100 ~ +100 なので、それを考慮した変化量にしましょう。 RelationshipChangeWithQuestGiver = 10; // QuestGiver 以外との Relation を変えたいときは、ChangeRelationAction クラスを使います。 // using TaleWorlds.CampaignSystem.Actions // // 例えば、QuestGiver と同じ拠点にいる全ての Notable (有力者) との Relation も上げたいのであれば // 以下のようにします。 foreach (Hero hero in QuestGiver.CurrentSettlement.Notables) { // QuestGiver はすでに上げてあるので除外。 if (hero != QuestGiver) { ChangeRelationAction.ApplyPlayerRelation(hero, 2); } } // Hero の Power 変更は簡単です。 // 公式のクエストを見るに、変化量は最大で±10程度にしておくのがよさそうです。 QuestGiver.AddPower(10f); // 各 Trait (Mercy, Valor, Honor, Generosity, Calculating) の値の幅は -4000 ~ +4000 です。 // using TaleWorlds.CampaignSystem.CharacterDevelopment.Managers TraitLevelingHelper.OnIssueSolvedThroughQuest( QuestGiver, new Tuple TraitObject, int [] { new Tuple TraitObject, int (DefaultTraits.Honor, 50), new Tuple TraitObject, int (DefaultTraits.Mercy, 20) }); } public override void OnFailed() { RelationshipChangeWithQuestGiver = -10; QuestGiver.AddPower(-5f); TraitLevelingHelper.OnIssueFailed( QuestGiver, new Tuple TraitObject, int [] { new Tuple TraitObject, int (DefaultTraits.Honor, -50) }); } protected override void OnTimedOut() { RelationshipChangeWithQuestGiver = -5; QuestGiver.AddPower(-5f); TraitLevelingHelper.OnIssueFailed( QuestGiver, new Tuple TraitObject, int [] { new Tuple TraitObject, int (DefaultTraits.Honor, -25) }); } Quest の中断 Issue の関係者が死亡したとか、拠点が略奪を受けたために期限内に報告できないとかいうような状況になってしまうこともあり得ます。そうした不可抗力が発生してしまった場合には Quest を中断させましょう。公式のクエストは、拠点が略奪を受けた時と、プレイヤーと IssueOwner の所属勢力同士が戦争を始めた時に中断していることが多いです。 + サンプルコード VillageNeedsFoodIssueQuest private TextObject VillageRaidedLog { get { TextObject textObject = new TextObject("{VILLAGE.LINK} が略奪を受けたようだ。 もはや任務どころではない。"); StringHelpers.SetSettlementProperties("VILLAGE", QuestGiver.CurrentSettlement, textObject); return textObject; } } private TextObject WarDeclaredLog { get { TextObject textObject = new TextObject("{QUEST_GIVER.LINK} の国と戦争が始まった。 {?QUEST_GIVER.GENDER}彼女{?}彼{\\?}との約束もこれまでだろう。"); StringHelpers.SetCharacterProperties("QUEST_GIVER", QuestGiver.CharacterObject, textObject); return textObject; } } protected override void RegisterEvents() { CampaignEvents.RaidCompletedEvent.AddNonSerializedListener(this, OnRaidCompleted); CampaignEvents.WarDeclared.AddNonSerializedListener(this, OnWarDeclared); } private void OnRaidCompleted(BattleSideEnum winnerSide, MapEvent mapEvent) { if (mapEvent.MapEventSettlement == QuestGiver.CurrentSettlement) { CompleteQuestWithCancel(VillageRaidedLog); } } private void OnWarDeclared(IFaction faction1, IFaction faction2) { if ((faction1.MapFaction == Clan.PlayerClan.MapFaction faction2.MapFaction == QuestGiver.MapFaction) || (faction2.MapFaction == Clan.PlayerClan.MapFaction faction1.MapFaction == QuestGiver.MapFaction)) { CompleteQuestWithCancel(WarDeclaredLog); } } 会話の作成 導入部 Issue に関する NPC とのやり取りの導入部は会話の流れが決まっており、“I heard you may need some help with a problem?”(何か困りごとがあると聞いたが?) より後の部分を、IssueBase クラスに用意された会話の部品となるプロパティをオーバーライドすることで成立させます。 IssueBase のプロパティ public abstract TextObject IssueBriefByIssueGiver Issue 内容を説明する IssueOwner のセリフです。 public abstract TextObject IssueAcceptByPlayer Issue 解決方法に関して説明を求めるプレイヤーのセリフです。 protected virtual TextObject IssuePlayerResponseAfterLordExplanation protected virtual TextObject IssuePlayerResponseAfterAlternativeExplanation 詳細不明です。 public abstract TextObject IssueQuestSolutionExplanationByIssueGiver クエストによる解決に必要な事柄を説明する IssueOwner のセリフです。 public virtual TextObject IssueAlternativeSolutionExplanationByIssueGiver コンパニオンによる解決に必要な事柄を説明する IssueOwner のセリフです。 protected virtual TextObject IssueLordSolutionExplanationByIssueGiver 領主としての解決に必要な事柄を説明する IssueOwner のセリフです。 protected virtual TextObject IssueRewardExplanationByIssueGiver 現状は使われていません。 public abstract TextObject IssueQuestSolutionAcceptByPlayer プレイヤー自身が解決する選択肢を選んだ際のプレイヤーのセリフです。 public virtual TextObject IssueAlternativeSolutionAcceptByPlayer public virtual TextObject IssueAlternativeSolutionResponseByIssueGiver コンパニオンに解決させる選択肢を選んだ際のプレイヤーと IssueOwner のセリフです。 protected virtual TextObject IssueLordSolutionAcceptByPlayer protected virtual TextObject IssueLordSolutionResponseByIssueGiver プレイヤーが領主として解決する選択肢を選んだ際のプレイヤーと IssueOwner のセリフです。 protected virtual TextObject IssueLordSolutionCounterOfferBriefByOtherNpc protected virtual TextObject IssueLordSolutionCounterOfferExplanationByOtherNpc protected virtual TextObject IssueLordSolutionCounterOfferAcceptByPlayer protected virtual TextObject IssueLordSolutionCounterOfferDeclineByPlayer protected virtual TextObject IssueLordSolutionCounterOfferAcceptResponseByOtherNpc protected virtual TextObject IssueLordSolutionCounterOfferDeclineResponseByOtherNpc IssueOwner と利害が対立する NPC が、逆オファーを持ちかけてくるような展開のクエストで使用します。 DialogFlow 導入部以外の会話は TaleWorlds.CampaignSystem.DialogFlow クラスを使って一から組み立てなければなりません。 [[NPC]]「こんにちは」 プレイヤー「やあどうも」 [[NPC]]「今日はどういったご用件で?」 プレイヤー「これこれこういう用で…」 [[NPC]]「分かりました。他に何か?」 ・ある プレイヤー「こういったことが…」 → 「他に何か?」に戻る ・ない [[NPC]]「では、これにて」 のような一連のやり取りをひとまとめにするものだと考えてください。 DialogFlow のメソッドは DialogFlow 自身を返すので、会話の流れに沿ってメソッドを連結していけます。 上の例は、おおむね次のようになります。 var dialogFlow = DialogFlow.CreateDialogFlow("conv_start") // 渡している文字列 (トークン) は適当です .NpcLine("こんにちは") .PlayerLine("やあどうも") .NpcLine("今日はどういったご用件で?") .PlayerLine("これこれこういう用で…") .GetOutputToken(out string token) .NpcLine("分かりました。他に何か?") .BeginPlayerOptions() .PlayerOption("ある") .PlayerLine("こういったことが…") .GotoDialogState(token) .PlayerOption("ない") .NpcLine("では、これにて") .EndPlayerOptions() .CloseDialog(); DialogFlow のメソッド public static DialogFlow CreateDialogFlow(string inputToken = null, int priority = 100) DialogFlow 自体を生成します。 public DialogFlow NpcLine(string npcText, ConversationSentence.OnMultipleConversationConsequenceDelegate speakerDelegate = null, ConversationSentence.OnMultipleConversationConsequenceDelegate listenerDelegate = null) NPC 側のセリフです。 public DialogFlow Condition(ConversationSentence.OnConditionDelegate conditionDelegate) 直前のセリフを条件付きで表示するときに用います。 public DialogFlow Consequence(ConversationSentence.OnConsequenceDelegate consequenceDelegate) 直前のセリフが表示された後に実行される処理を指定します。 public DialogFlow BeginPlayerOptions() public DialogFlow EndPlayerOptions() public DialogFlow PlayerOption(string text, ConversationSentence.OnMultipleConversationConsequenceDelegate listenerDelegate = null) 選択肢を作るときに用います。PlayerOption() が各選択肢で、それを BeginPlayerOptions() と EndPlayerOptions() で挟むようにします。 public DialogFlow GetOutputToken(out string oState) public DialogFlow GotoDialogState(string input) 会話の特定位置にジャンプするときに用います。 public DialogFlow CloseDialog() 会話を終了します。 TextObject の装飾 TaleWorlds.Localization.TextObject の文字列には、特殊な記述によってキャラクター等が持つ動的なパラメーターを反映させることができます。 TextObject textObject = new TextObject("私の名前は {PLAYER.LINK}。 年齢{PLAYER.AGE}歳だ。"); StringHelpers.SetCharacterProperties("PLAYER", Hero.MainHero.CharacterObject, textObject); "PLAYER" となっている部分は任意の文字列リテラルです。ドット以下の部分は使用したメソッドによって使えるものが異なります。どういう値に置換されるのかは Helpers.StringHelpers クラスを参照してください。 上の例は、名前が百科事典のリンク付きになり、現在の年齢が表示されます。 サンプルクエスト最終形 これまでの肉付けを踏まえたコードの最終形です。 VillageNeedsFood.cs + クリックで展開 using Helpers;using System;using System.Collections.Generic;using TaleWorlds.CampaignSystem;using TaleWorlds.CampaignSystem.Actions;using TaleWorlds.CampaignSystem.CharacterDevelopment.Managers;using TaleWorlds.CampaignSystem.SandBox;using TaleWorlds.Core;using TaleWorlds.Library;using TaleWorlds.Localization;using TaleWorlds.SaveSystem; namespace ExampleIssues{ public class VillageNeedsFoodBehavior CampaignBehaviorBase { private const int VillageFoodThreshold = 10; private const int TownFoodThreshold = 50; private const int MinTroopTier = 1; private const float IssueDuration = 30f; private const float QuestTimeLimit = 10f; private const float IssuePreConditionMinPlayerRelation = -10f; public override void RegisterEvents() { CampaignEvents.OnCheckForIssueEvent.AddNonSerializedListener(this, OnCheckForIssue); } public override void SyncData(IDataStore dataStore) { } // イベントリスナーです。 private void OnCheckForIssue(Hero hero) { // 詳しいことは分かりませんが、条件に合う Hero が見つかると // 指定した頻度で Issue が生成されるという感じでしょうか。 if (ConditionsHold(hero)) { Campaign.Current.IssueManager.AddPotentialIssueData( hero, new PotentialIssueData( new PotentialIssueData.StartIssueDelegate(OnStartIssue), typeof(VillageNeedsFoodIssue), IssueBase.IssueFrequency.VeryCommon, null)); } else { Campaign.Current.IssueManager.AddPotentialIssueData( hero, new PotentialIssueData( typeof(VillageNeedsFoodIssue), IssueBase.IssueFrequency.VeryCommon)); } } // Hero が Issue を持つのに必要な条件を設定しています。 // // 開始直後から困窮している場所など無いと思われるので、 // テストプレイ用に条件は甘くしてあります。 private bool ConditionsHold(Hero issueOwner) { // IssueOwner になれるのは Headman (村長) のみ // IssueOwner は村に所属していなければならない // その村の食糧は一定値未満でなければならない Settlement currentSettlement = issueOwner.CurrentSettlement; if (!issueOwner.IsHeadman || currentSettlement is null || !currentSettlement.IsVillage || currentSettlement.ItemRoster.GetItemNumber(DefaultItems.Grain) = VillageFoodThreshold) { return false; } // 町と取引していないか、町にも食糧が無い Settlement tradeBound = currentSettlement.Village.TradeBound; return tradeBound is null || tradeBound.ItemRoster.GetItemNumber(DefaultItems.Grain) TownFoodThreshold; } private IssueBase OnStartIssue(in PotentialIssueData pid, Hero issueOwner) { return new VillageNeedsFoodIssue(issueOwner, DefaultItems.Grain); } // ---------------------------------------------------------------- // Issue に対する Behavior の定義はここまで。 // // ここからは、カスタム型を保存するためのクラスです。 // ---------------------------------------------------------------- // カスタムビヘイビアーで使用する型を登録します。 public class VillageNeedsFoodBehaviorTypeDefiner SaveableCampaignBehaviorTypeDefiner { // saveBaseId は、自分のビヘイビアー同士はもちろん、同時使用している他の MOD とも被ってはいけないそうです。 // また、番号を途中で変えるとセーブデータ読み込み時にクラッシュします。 // 番号付け規則は、追々コミュニティー内で意思統一が図られることでしょう。 public VillageNeedsFoodBehaviorTypeDefiner() base(001_123_456) { } // このクエストで使う独自のクラスを登録しています。 // // 構造体型なら SaveableTypeDefiner.DefineStructTypes() // 列挙型なら SaveableTypeDefiner.DefineEnumTypes() // のようにメソッドが分かれています。 protected override void DefineClassTypes() { // こちらの saveId は、各 SaveableCampaignBehaviorTypeDefiner の中で被りが無ければいいようです。 AddClassDefinition(typeof(VillageNeedsFoodIssue), 1); AddClassDefinition(typeof(VillageNeedsFoodIssueQuest), 2); } } // ---------------------------------------------------------------- // カスタム型の宣言はここまで。 // // ここからは Issue 本体の定義です。 // ---------------------------------------------------------------- internal class VillageNeedsFoodIssue IssueBase { [SaveableField(10)] private readonly ItemObject _requestedFood; // IssueBase.IssueBase() に渡す日数は、Issue が自然消滅するまでの日数です。 // クエストの達成期限と混同しないようにしてください。 public VillageNeedsFoodIssue(Hero issueOwner, ItemObject requestedFood) base(issueOwner, CampaignTime.DaysFromNow(IssueDuration)) { _requestedFood = requestedFood; } // Issue のタイトルです。 // 町などで Issue を抱えている人物のポートレートに表示されます。 // Quest のタイトルとは同じにも別にもできます。 // // チートコードで IssueOwner を探せなくなるので、テストでは日本語名は避けた方がいいです。 public override TextObject Title = new TextObject("Village Needs Food"); // Issue 内容の簡単な説明です。 // IssueOwner のポートレートで Title にマウスカーソルを合わせるとホバー表示されます。 public override TextObject Description { get { TextObject textObject = new TextObject("{ISSUE_OWNER.LINK} が食糧を届けるよう頼んでいる。"); StringHelpers.SetCharacterProperties("ISSUE_OWNER", IssueOwner.CharacterObject, textObject); return textObject; } } // 導入部のセリフのオーバーライドです。 public override TextObject IssueBriefByIssueGiver { get { TextObject textObject = new TextObject( "{FOOD} が乏しくなっているのですが、 " + "近くの町でもあまり手に入らないのです。 " + "このご時世、あまり遠方へ買い求めに行くことも " + "できず、困っております。"); textObject.SetTextVariable("FOOD", _requestedFood.Name); return textObject; } } public override TextObject IssueAcceptByPlayer = new TextObject( "何か私にできることはあるか?"); public override TextObject IssueQuestSolutionExplanationByIssueGiver = new TextObject( "いずこかで買い求め、持ってきてはいただけませ " + "んでしょうか? 報酬はお支払いいたします。"); public override TextObject IssueQuestSolutionAcceptByPlayer = new TextObject( "わかった、やってみよう。"); // コンパニオンに解決を任せられるか否かです。 public override bool IsThereAlternativeSolution = true; // Alternative Solution 用のセリフです。 public override TextObject IssueAlternativeSolutionExplanationByIssueGiver = new TextObject( "あなた様のご都合が悪いようであれば、お側付き " + "の方に届けていただくのでも構いません。"); public override TextObject IssueAlternativeSolutionAcceptByPlayer = new TextObject( "ならば部下を遣わすとしよう。"); public override TextObject IssueAlternativeSolutionResponseByIssueGiver = new TextObject( "それでは、よろしくお願いいたします。"); // Alternative Solution 用のログテキストです。 protected override TextObject AlternativeSolutionStartLog { get { TextObject textObject = new TextObject( "{SETTLEMENT.LINK} の {ISSUE_OWNER.LINK} に、 {REQUESTED_FOOD} を持ってくるよう頼まれた。 " + "あなたは部下の {COMPANION.LINK} に{TROOP_COUNT}人の兵を預け、それら届けさせることにした。 " + "{RETURN_DAYS}日後には任務を終え、戻ってくるだろう。 " + "その際には、報酬として {PAYMENT}{GOLD_ICON} を手にしてくるはずだ。"); StringHelpers.SetSettlementProperties("SETTLEMENT", IssueOwner.CurrentSettlement, textObject); StringHelpers.SetCharacterProperties("ISSUE_OWNER", IssueOwner.CharacterObject, textObject); StringHelpers.SetCharacterProperties("COMPANION", AlternativeSolutionHero.CharacterObject, textObject); textObject.SetTextVariable("REQUESTED_FOOD", _requestedFood.Name) .SetTextVariable("TROOP_COUNT", AlternativeSolutionSentTroops.TotalManCount) .SetTextVariable("RETURN_DAYS", GetTotalAlternativeSolutionDurationInDays()) .SetTextVariable("PAYMENT", RewardGold); return textObject; } } protected override TextObject AlternativeSolutionEndLogDefault { get { TextObject textObject = new TextObject( "{COMPANION.LINK} たちは {REQUESTED_FOOD} を無事に届けた。 " + "{ISSUE_OWNER.LINK} は大いに喜び、約束通りの報酬を差し出した。"); StringHelpers.SetCharacterProperties("COMPANION", AlternativeSolutionHero.CharacterObject, textObject); StringHelpers.SetCharacterProperties("ISSUE_OWNER", IssueOwner.CharacterObject, textObject); textObject.SetTextVariable("REQUESTED_FOOD", _requestedFood.Name) .SetTextVariable("PAYMENT", RewardGold); return textObject; } } // 領主として影響力を消費して解決できるか否かです。 public override bool IsThereLordSolution = false; protected override int AlternativeSolutionNeededBaseMenCountInternal = (int)(9f + (14f * IssueDifficultyMultiplier)); protected override int AlternativeSolutionBaseDurationInDaysInternal = (int)(10f + (8f * IssueDifficultyMultiplier)); protected override int RewardGold = (int)(500f + (1000f * IssueDifficultyMultiplier)); protected override int CompanionSkillRewardXP = (int)(600f + (800f * IssueDifficultyMultiplier)); // コンパニオンに求められるスキル値です。 // しきい値を下回っているコンパニオンに任せると失敗する可能性が発生します。 public override List SkillObject GetAlternativeSolutionRequiredCompanionSkill(out int requiredSkillLevel) { requiredSkillLevel = CompanionSkillThreshold; return new List SkillObject { DefaultSkills.Roguery, DefaultSkills.Trade, }; } // 要求される食糧の量です。 // クエスト難易度でスケーリングしています。 private int RequestedFoodAmount = (int)(15f + (30f * IssueDifficultyMultiplier)); private int CompanionSkillThreshold = 75; // Issue が自動生成される頻度です。 // IssueFrequency.VeryCommon // IssueFrequency.Common // IssueFrequency.Rare public override IssueFrequency GetFrequency() { return IssueFrequency.VeryCommon; } // Issue が消滅する条件を設定できます (StayAlive なので、正確には「消滅しないための条件」です)。 // // 例えば、この Issue が「物資を依頼人とは別の人のもとに届ける」というような内容だった場合、 // 届け先の人物が何らかの理由でゲームから退場してしまったら、その時点で Issue は破棄されなければなりません。 // (もちろん、プレイヤーが既にクエストを請けていればクエストも中止されるべきですが、それは Quest 側の仕事です。) // それには、以下のような感じにします。フィールドはあくまで一例です。 // bool IssueStayAliveConditions() = _targetNotable.IsActive; public override bool IssueStayAliveConditions() { // 食糧がクエスト開始条件の3倍以上に増えたら false を返して消滅させます。 return IssueOwner.CurrentSettlement.ItemRoster.GetItemNumber(_requestedFood) VillageFoodThreshold * 3; } // プレイヤーが Issue 解決を請け負えるかどうかの条件を設定できます。 protected override bool CanPlayerTakeQuestConditions( Hero issueGiver, out PreconditionFlags flag, out Hero relationHero, out SkillObject skill) { // 各条件に対応する PreconditionFlags でビットマスクをかけていきます。 flag = PreconditionFlags.None; relationHero = null; skill = null; // 友好度が低いと受けられないようにする。 if (issueGiver.GetRelationWithPlayer() IssuePreConditionMinPlayerRelation) { // このフラグを立てたときには、誰と仲が悪くて受けられないのかを返す必要があるようです。 flag |= PreconditionFlags.Relation; relationHero = issueGiver; } // 所属国同士が戦争中だと受けられないようにする。 if (issueGiver.MapFaction.IsAtWarWith(Hero.MainHero.MapFaction)) { flag |= PreconditionFlags.AtWar; } // いずれかのフラグが立っていると false が返るので請け負えなくなります。 return flag == PreconditionFlags.None; } // 詳細不明。公式の Issue でもほぼ使われていません。 protected override void CompleteIssueWithTimedOutConsequences() { } // Quest の発行処理です。 // コンストラクターに渡す日数は Quest の達成期限です。 protected override QuestBase GenerateIssueQuest(string questId) { return new VillageNeedsFoodIssueQuest( questId, IssueOwner, RequestedFoodAmount, _requestedFood, RewardGold, CampaignTime.DaysFromNow(QuestTimeLimit)); } protected override void OnGameLoad() { } // Issue 発生の影響です。 protected override Dictionary IssueEffect, float GetIssueEffectsAndAmountInternal() { // 変化量は1日あたりのものです。Issue の自然消滅日数を考慮して設定しないと、 // トータルのペナルティが重くなりすぎてしまいます。 return new Dictionary IssueEffect, float () { { DefaultIssueEffects.VillageHearth, -0.5f }, { DefaultIssueEffects.IssueOwnerPower, -0.2f } }; } public override bool DoTroopsSatisfyAlternativeSolution(TroopRoster troopRoster, out TextObject explanation) { explanation = TextObject.Empty; return QuestHelper.CheckRosterForAlternativeSolution(troopRoster, GetTotalAlternativeSolutionNeededMenCount(), ref explanation, MinTroopTier); } // 任務に派遣可能な英雄の条件です。 // e1.6.2 にて条件による制限は撤廃され、代わりに担当者のスキルに応じて失敗確率が発生するようになりました。 /* public override bool CompanionOrFamilyMemberClickableCondition(Hero companion, out TextObject explanation) { GetAlternativeSolutionRequiredCompanionSkills(out Dictionary SkillObject, int shouldHaveAll, out Dictionary SkillObject, int shouldHaveOneOfThem); explanation = TextObject.Empty; return QuestHelper.CheckCompanionForAlternativeSolution(companion.CharacterObject, ref explanation, shouldHaveAll, shouldHaveOneOfThem); } */ public override bool IsTroopTypeNeededByAlternativeSolution(CharacterObject character) { return character.Tier = MinTroopTier; } public override void AlternativeSolutionStartConsequence() { // 食糧の購入資金を差し引いています。 Hero.MainHero.ChangeHeroGold(-_requestedFood.Value * RequestedFoodAmount); } protected override void AlternativeSolutionEndWithSuccessConsequence() { // 担当キャラクターに対する報酬は、プロパティで設定してあるので勝手に適用されます。 // クリアしたことによる影響 RelationshipChangeWithIssueOwner = 10; foreach (Hero hero in IssueOwner.CurrentSettlement.Notables) { // QuestGiver はすでに上げてあるので除外。 if (hero != IssueOwner) { ChangeRelationAction.ApplyPlayerRelation(hero, 2); } } IssueOwner.AddPower(10f); TraitLevelingHelper.OnIssueSolvedThroughQuest( IssueOwner, new Tuple TraitObject, int [] { new Tuple TraitObject, int (DefaultTraits.Honor, 50), new Tuple TraitObject, int (DefaultTraits.Mercy, 20) }); } /* private void GetAlternativeSolutionRequiredCompanionSkills(out Dictionary SkillObject, int shouldHaveAll, out Dictionary SkillObject, int shouldHaveOneOfThem) { // 必須スキル // こちらの Dictionary に登録したスキルは、全てが指定レベル以上でなければなりません。 shouldHaveAll = new Dictionary SkillObject, int { { DefaultSkills.Trade, CompanionSkillThreshold } }; // 選択スキル // こちらの Dictionary に登録したスキルは、いずれかが指定レベル以上でなければなりません。 shouldHaveOneOfThem = null; // 例えば「近接武器スキルいずれか」という条件を追加したいのであれば、以下のように記述します。 // もちろん、しきい値は同一でなくても構いません。 // // shouldHaveOneOfThem = new Dictionary SkillObject, int // { // { DefaultSkills.OneHanded, CompanionSkillThreshold }, // { DefaultSkills.TwoHanded, CompanionSkillThreshold }, // { DefaultSkills.Polearm, CompanionSkillThreshold } // }; } */ } // ---------------------------------------------------------------- // Issue の定義はここまで。 // // ここからは Quest の定義です。 // ---------------------------------------------------------------- internal class VillageNeedsFoodIssueQuest QuestBase { // これらのフィールドは、セーブ/ロードをまたいで保持されるべき数値なので、SaveableField 属性を与えています。 // SaveableCampaignBehaviorTypeDefiner の宣言だけではダメなようです。 [SaveableField(10)] private readonly ItemObject _foodToBeDelivered; [SaveableField(20)] private readonly int _numFoodToBeDelivered; [SaveableField(30)] private JournalLog _progressLog; // Quest のタイトルです。 // ジャーナル (クエストログ) に表示されます。 // Issue のタイトルとは同じにも別にもできます。 public override TextObject Title = new TextObject("村が食糧を求めている"); // ジャーナルで達成期限を非表示にするか否かです。 public override bool IsRemainingTimeHidden = false; private TextObject QuestAcceptLog { get { TextObject textObject = new TextObject("{SETTLEMENT.LINK} の {QUEST_GIVER.LINK} に、{REQUESTED_FOOD} を持ってくるよう頼まれた。 報酬として {PAYMENT}{GOLD_ICON} を払ってくれるそうだ。"); StringHelpers.SetSettlementProperties("SETTLEMENT", QuestGiver.CurrentSettlement, textObject); StringHelpers.SetCharacterProperties("QUEST_GIVER", QuestGiver.CharacterObject, textObject); textObject.SetTextVariable("REQUESTED_FOOD", _foodToBeDelivered.Name) .SetTextVariable("PAYMENT", RewardGold); return textObject; } } private TextObject QuestSuccessLog { get { TextObject textObject = new TextObject("{QUEST_GIVER.LINK} のもとに、約束していた食糧を届けた。"); StringHelpers.SetCharacterProperties("QUEST_GIVER", QuestGiver.CharacterObject, textObject); return textObject; } } private TextObject FoodGatheredInfo { get { TextObject textObject = new TextObject("必要な {FOOD} が集まりました。 依頼人の所に戻りましょう。"); textObject.SetTextVariable("FOOD", _foodToBeDelivered.Name); return textObject; } } private TextObject VillageRaidedLog { get { TextObject textObject = new TextObject("{VILLAGE.LINK} が略奪を受けたようだ。 もはや任務どころではない。"); StringHelpers.SetSettlementProperties("VILLAGE", QuestGiver.CurrentSettlement, textObject); return textObject; } } private TextObject WarDeclaredLog { get { TextObject textObject = new TextObject("{QUEST_GIVER.LINK} の国と戦争が始まった。 {?QUEST_GIVER.GENDER}彼女{?}彼{\\?}との約束もこれまでだろう。"); StringHelpers.SetCharacterProperties("QUEST_GIVER", QuestGiver.CharacterObject, textObject); return textObject; } } public VillageNeedsFoodIssueQuest( string questId, Hero questGiver, int numFoodToBeDelivered, ItemObject foodToBeDelivered, int rewardGold, CampaignTime duration) base(questId, questGiver, duration, rewardGold) { _numFoodToBeDelivered = numFoodToBeDelivered; _foodToBeDelivered = foodToBeDelivered; SetDialogs(); InitializeQuestOnCreation(); } private int CurrentFoodAmount = PartyBase.MainParty.ItemRoster.GetItemNumber(_foodToBeDelivered); // クエスト進行中にゲームをセーブ - ロードした場合の初期化はここで行われます。 protected override void InitializeQuestOnGameLoad() { SetDialogs(); } // 会話の流れと、それに伴う処理のデリゲートを設定します。 protected override void SetDialogs() { OfferDialogFlow = DialogFlow.CreateDialogFlow(IssueManager.IssueClassicQuestStartToken) .NpcLine("お手数ですが、よろしくお願いいたします。") .Condition(() = Hero.OneToOneConversationHero == QuestGiver) .Consequence(new ConversationSentence.OnConsequenceDelegate(QuestAcceptedConsequences)) .CloseDialog(); DiscussDialogFlow = DialogFlow.CreateDialogFlow(QuestManager.QuestDiscussToken) .NpcLine("お頼みした仕事の首尾はいかがですかな?") .Condition(() = Hero.OneToOneConversationHero == QuestGiver) .BeginPlayerOptions() .PlayerOption("うむ、ここに持ってまいった。") .Condition(new ConversationSentence.OnConditionDelegate(PlayerHasFood)) .NpcLine("おお、ありがとうございます。 それでは、こちらをお納めくだされ。") .Consequence(new ConversationSentence.OnConsequenceDelegate(QuestFinishedConsequences)) .PlayerOption("いま取り組んでいるところだ。 しばし待たれよ。") .NpcLine("さようですか。 何卒よろしくお願いいたします。") .EndPlayerOptions() .CloseDialog(); // QuestCharacterDialogFlow = DialogFlow.CreateDialogFlow(QuestManager.CharacterTalkToken); } protected override void RegisterEvents() { CampaignEvents.PlayerInventoryExchangeEvent.AddNonSerializedListener(this, OnPlayerInventoryExchange); CampaignEvents.RaidCompletedEvent.AddNonSerializedListener(this, OnRaidCompleted); CampaignEvents.WarDeclared.AddNonSerializedListener(this, OnWarDeclared); } protected override void OnCompleteWithSuccess() { // プレイヤーキャラクターに対する報酬 // IssueBase.RewardGold が設定してあれば、QuestBase.RewardGold ↓ にも反映されています。 GiveGoldAction.ApplyBetweenCharacters(null, Hero.MainHero, RewardGold); Hero.MainHero.AddSkillXp(DefaultSkills.Athletics, 100f); // クリアしたことによる影響 RelationshipChangeWithQuestGiver = 10; foreach (Hero hero in QuestGiver.CurrentSettlement.Notables) { // QuestGiver はすでに上げてあるので除外。 if (hero != QuestGiver) { ChangeRelationAction.ApplyPlayerRelation(hero, 2); } } QuestGiver.AddPower(10f); TraitLevelingHelper.OnIssueSolvedThroughQuest( QuestGiver, new Tuple TraitObject, int [] { new Tuple TraitObject, int (DefaultTraits.Honor, 50), new Tuple TraitObject, int (DefaultTraits.Mercy, 20) }); } public override void OnFailed() { RelationshipChangeWithQuestGiver = -10; QuestGiver.AddPower(-5f); TraitLevelingHelper.OnIssueFailed( QuestGiver, new Tuple TraitObject, int [] { new Tuple TraitObject, int (DefaultTraits.Honor, -50) }); } protected override void OnTimedOut() { RelationshipChangeWithQuestGiver = -5; QuestGiver.AddPower(-5f); TraitLevelingHelper.OnIssueFailed( QuestGiver, new Tuple TraitObject, int [] { new Tuple TraitObject, int (DefaultTraits.Honor, -25) }); } // 以下、会話の特定の段階で実行される処理です。 // クエストを請けたとき private void QuestAcceptedConsequences() { AddLog(QuestAcceptLog); // プログレスバーを追加しています。 TextObject text = new TextObject("{FOOD}を{FOOD_NUMBER}集める。") .SetTextVariable("FOOD", _foodToBeDelivered.Name) .SetTextVariable("FOOD_NUMBER", _numFoodToBeDelivered); // text の部分を TextObject.Empty とすれば、純粋にプログレスバーだけの表示になります。 _progressLog = AddDiscreteLog(text, new TextObject("集めた食糧"), 0, _numFoodToBeDelivered); UpdateProgress(); // これを呼ぶだけで、通知の表示や効果音再生など、クエスト開始に伴う処理が自動的に実行されます。 StartQuest(); } // クエスト目標をクリアしたとき private void QuestFinishedConsequences() { TransferFoodFromPlayerInventory(); AddLog(QuestSuccessLog); // クエストがどういう結果に終わったのかを QuestBase に知らせる必要があります。 // CompleteQuestWithSuccess() なら成功 // CompleteQuestWithFail() なら失敗 // CompleteQuestWithCancel() なら中止 // CompleteQuestWithTimedOut() なら期限切れ // CompleteQuestWithBetrayal() なら依頼人を裏切る形での決着 CompleteQuestWithSuccess(); } private bool PlayerHasFood() { return CurrentFoodAmount = _numFoodToBeDelivered; } private void TransferFoodFromPlayerInventory() { GiveItemAction.ApplyForParties( PartyBase.MainParty, QuestGiver.CurrentSettlement.Party, _foodToBeDelivered, _numFoodToBeDelivered); } private void UpdateProgress() { _progressLog.UpdateCurrentProgress((int)MathF.Clamp(CurrentFoodAmount, 0f, _numFoodToBeDelivered)); } // 以下、クエストの推移を判断するためのイベントリスナーです。 private void OnPlayerInventoryExchange( List ValueTuple ItemRosterElement, int purchasedItems, List ValueTuple ItemRosterElement, int soldItems, bool isTrading) { UpdateProgress(); foreach ((ItemRosterElement purchasedItem, int _) in purchasedItems) { // インベントリーに Grain が入れられた場合 if (purchasedItem.EquipmentElement.Item == _foodToBeDelivered PlayerHasFood()) { // クリア条件を満たしたことを通知でプレイヤーに知らせています。 InformationManager.AddQuickInformation(FoodGatheredInfo); break; } } } private void OnRaidCompleted(BattleSideEnum winnerSide, MapEvent mapEvent) { if (mapEvent.MapEventSettlement == QuestGiver.CurrentSettlement) { CompleteQuestWithCancel(VillageRaidedLog); } } private void OnWarDeclared(IFaction faction1, IFaction faction2) { if ((faction1.MapFaction == Clan.PlayerClan.MapFaction faction2.MapFaction == QuestGiver.MapFaction) || (faction2.MapFaction == Clan.PlayerClan.MapFaction faction1.MapFaction == QuestGiver.MapFaction)) { CompleteQuestWithCancel(WarDeclaredLog); } } } }} 名前